我有这个类层次结构:
class Parent
attr_accessor :params
def initialize
@params = {"original" => "original"}
end
end
class Child < Parent
def params
super
end
def update_params_1
params = {"update" => "update"}
params
end
def update_params_2
temp_var = params
params = temp_var.merge({"update" => "update"})
params
end
def update_params_3
params = params.merge({"update" => "update"})
params
end
end
child = Child.new
child.update_params_1
# => {"update"=>"update"}
child.update_params_2
# => {"original"=>"original", "update"=>"update"}
child.update_params_3
# => undefined method `merge' for nil:NilClass (NoMethodError)
在update_params_3
中,params
为nil
。
在参与赋值运算符的RHS上的方法调用时,我认为params
可能始终为nil
。但事实并非如此。我添加了这个方法来验证Ruby是否允许在RHS上向链添加方法。它按预期工作。
def right_hand_side
temp_var = params.inspect
puts temp_var
end
为什么在链接params
的来电之前,Ruby无法解析update_params_3
中的merge
来电?为什么params
nil
仅适用于我为params
分配值的情况?这是故意还是Ruby中的错误?
答案 0 :(得分:1)
params = ...
分配给名为params
的局部变量。您实际上没有修改@params
,只需创建一个名为params
的局部变量并将其返回。
如果您打算在self.params = ...
上使用params=
访问者,则在每次执行作业时都需要self
。
答案 1 :(得分:1)
这是因为在params
之前解析nil
或者执行params = ...
之后,创建了局部变量params.merge({"update" => "update"})
并将其初始化为params
。
由于局部变量优先于方法,params.merge({"update" => "update"})
中的params
被解释为新创建的局部变量params
,而不是方法android:animateLayoutChanges="true"
。