Ruby 为什么“super”不能按预期顺序解析?

Ruby 为什么“super”不能按预期顺序解析?,ruby,variable-assignment,local-variables,Ruby,Variable Assignment,Local Variables,我有这个类层次结构: 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" => "

我有这个类层次结构:

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)

为什么Ruby在将调用链接到
合并之前不在
更新\u params_3
中解析
参数
调用?为什么
params
nil
仅在我为
params
赋值的情况下才有效?这是故意的还是Ruby中的错误?

params=…
分配给名为
params
的局部变量。实际上,在任何时候都不需要修改
@params
,只需创建一个名为
params
的局部变量并返回它


如果要在
self
params=…
上使用
params=
访问器,则在执行赋值的每种情况下都需要
self.params=…
赋值给名为
params
的局部变量。实际上,在任何时候都不需要修改
@params
,只需创建一个名为
params
的局部变量并返回它


如果您打算在
self
上使用
params=
访问器,则在执行赋值的每种情况下都需要
self.params=…
,这是因为在
params=…
解析之前或之后,会创建一个局部变量
params
,并将其初始化为
nil
params.merge({“update”=>“update”})
被执行


由于局部变量优先于方法,因此
params.merge({“update”=>“update”})中的
params
被解释为新创建的局部变量
params
而不是方法
params

,这是因为局部变量
params
params=…
解析之前或
params.merge({“update”=>“update”})之后创建并初始化为
nil
执行


由于局部变量优先于方法,因此
params.merge({“update”=>“update”})中的
params
被解释为新创建的局部变量
params
,而不是方法
params

,Hm在您告诉我答案后似乎有点明显。。。现在我觉得自己很笨。嗯,当你告诉我答案后,似乎有点明显。。。现在我觉得自己很笨。
def right_hand_side
    temp_var = params.inspect
    puts temp_var
end