关于Elixir Phoenix中scope关键字及语法的疑问
Phoenix Router代码疑问解答
先看你提到的router.ex代码片段:
scope "/", HelloWeb do ----(1) pipe_through :browser get "/", PageController, :index ---(2) end
针对(1)行的疑问
这是调用scope函数吗?为何没有使用括号?
对,这就是调用scope/3函数。Elixir支持函数调用省略括号,只要是表达式开头且参数无歧义就行。Phoenix这类框架的DSL代码里常用这种写法,让代码更简洁易读,看起来更像声明式配置而非函数调用。HelloWeb是模块名,这里加它的作用是什么?
HelloWeb是这个路由scope的命名空间,给当前scope下所有路由统一设置模块前缀。也就是说,这个scope里的控制器、视图都会自动带上HelloWeb.前缀,不用每次都写完整模块名,大幅简化路由代码。
针对(2)行的疑问
代码如何找到PageController?它定义在HelloWeb.PageController模块里,是不是因为(1)行的HelloWeb才可以简写?
没错!正是因为(1)行指定了HelloWeb作为命名空间,Phoenix会自动把PageController补全为HelloWeb.PageController,从而定位到对应的控制器模块。:index代表什么(存在一个叫index的函数),冒号的作用是什么?我知道冒号表示原子,为什么这里用原子?
:index就是Elixir的原子,它指代控制器里的index/2函数(控制器函数默认接收conn和params两个参数)。Phoenix用原子指代动作的原因很实际:一是原子轻量高效,匹配速度快;二是原子是编译时确定的常量,能在编译阶段就检查对应的函数是否存在,提前排查错误,避免到运行时才出问题。
内容的提问来源于stack exchange,提问作者tmp dev
相关产品推荐
相关产品推荐

