为什么“超级”无法按预期顺序解决



我有此类层次结构:

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中,paramsnil

我认为params可能始终是nil,当参与分配运算符RHS的方法调用时。但这不是真的。我添加了此方法来验证Ruby允许在RHS上的链条上添加方法。它按预期工作。

def right_hand_side
    temp_var = params.inspect
    puts temp_var
end

为什么Ruby在将呼叫链接到merge之前不解决params呼叫?为什么仅在我为params分配值的情况下,为什么params nil?这是ruby的意图还是错误?

这是因为在params = ...之后或执行CC_14之后,创建并初始化了局部变量params,或者是执行params.merge({"update" => "update"})之后的nil

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

params = ...分配给称为 params的本地变量。您从未真正修改@params,您只需创建一个称为params的局部变量并返回。

如果您打算在self上使用params=访问者,则需要self.params = ...

最新更新