为什么 `super` 没有按预期的顺序解析?
Why is `super` not resolved in the expected order?
我有这个 class 层次结构:
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
为什么 Ruby 在将调用链接到 merge
之前不解析 update_params_3
中的 params
调用?为什么只有在我给params
赋值的情况下才会出现params
nil
?这是 Ruby 中的故意还是错误?
params = ...
分配给名为 params
的局部变量。在任何时候您实际上都不会修改 @params
,您只是创建一个名为 params
和 return 的局部变量。
如果您打算在 self
.
上使用 params=
访问器,则在执行赋值的任何情况下都需要 self.params = ...
这是因为局部变量params
被创建并初始化为nil
,在params = ...
被解析之后或者它或params.merge({"update" => "update"})
被执行
由于局部变量优先于方法,params.merge({"update" => "update"})
中的params
被解释为新创建的局部变量params
而不是方法params
。
我有这个 class 层次结构:
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
为什么 Ruby 在将调用链接到 merge
之前不解析 update_params_3
中的 params
调用?为什么只有在我给params
赋值的情况下才会出现params
nil
?这是 Ruby 中的故意还是错误?
params = ...
分配给名为 params
的局部变量。在任何时候您实际上都不会修改 @params
,您只是创建一个名为 params
和 return 的局部变量。
如果您打算在 self
.
params=
访问器,则在执行赋值的任何情况下都需要 self.params = ...
这是因为局部变量params
被创建并初始化为nil
,在params = ...
被解析之后或者它或params.merge({"update" => "update"})
被执行
由于局部变量优先于方法,params.merge({"update" => "update"})
中的params
被解释为新创建的局部变量params
而不是方法params
。