为什么`super`没有按预期顺序解决?

时间:2016-06-17 18:17:39

标签: 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" => "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

为什么在链接params的来电之前,Ruby无法解析update_params_3中的merge来电?为什么params nil仅适用于我为params分配值的情况?这是故意还是Ruby中的错误?

2 个答案:

答案 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"