我在rails控制器操作中有以下代码序列。在IF之前,params包含请求参数,如预期的那样。在它之后,params是零。谁能解释一下这里发生了什么?
if false
params = {:user => {:name => "user", :comment => 'comment'}}
end
谢谢。
答案 0 :(得分:11)
包含请求参数的params
实际上是一个方法调用,它返回包含参数的哈希。您的params =
行正在分配一个名为params
的本地变量。
在if false
块之后,Ruby已经看到了本地params
变量,因此当您在方法中稍后引用params
时,局部变量优先于调用同名方法。但是,由于params =
分配位于if false
块内,因此永远不会为局部变量赋值,因此局部变量为nil
。
如果在分配之前尝试引用局部变量,则会出现NameError:
irb(main):001:0> baz
NameError: undefined local variable or method `baz' for main:Object
from (irb):1
但是,如果对变量的赋值不在代码执行路径中,则Ruby已创建局部变量,但其值为nil
。
irb(main):007:0> baz = "Example" if false
=> nil
irb(main):008:0> baz
=> nil
请参阅:Assignment - Local Variables and Methods in the Ruby docs。