【问题标题】:Why is `super` not resolved in the expected order?为什么 `super` 没有按预期的顺序解决?
【发布时间】:2016-06-17 18:17:39
【问题描述】:

我有这个类层次结构:

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

当涉及到赋值运算符的 RHS 上的方法调用时,我认为 params 可能总是 nil。但事实并非如此。我添加了这个方法来验证 Ruby 是否允许将方法添加到 RHS 上的链中。它按预期工作。

def right_hand_side
    temp_var = params.inspect
    puts temp_var
end

为什么在将调用链接到merge 之前,Ruby 不解析update_params_3 中的params 调用?为什么paramsnil仅在我为params赋值的情况下?这是有意的还是 Ruby 中的错误?

【问题讨论】:

    标签: ruby variable-assignment local-variables


    【解决方案1】:

    这是因为一个局部变量paramsparams = ...被解析之前被创建并初始化为nil,或者它或params.merge({"update" =&gt; "update"})被执行。

    由于局部变量优先于方法,所以params.merge({"update" =&gt; "update"}) 中的params 被解释为新创建的局部变量params,而不是方法params

    【讨论】:

    • 嗯,一旦你告诉我答案,这似乎有点明显......现在我觉得很愚蠢。
    【解决方案2】:

    params = ... 分配给名为params 的局部变量。在任何时候您都不会真正修改@params,您只需创建一个名为params 的局部变量并返回它。

    如果您打算在self 上使用params= 访问器,则在执行分配的所有情况下都需要self.params = ...

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2022-01-17
      • 1970-01-01
      • 2021-12-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多