【问题标题】:Custom Struct method can't set struct member [duplicate]自定义结构方法无法设置结构成员 [重复]
【发布时间】:2016-03-29 13:38:59
【问题描述】:

一个例子将解释这个问题:

Val = Struct.new(:value) do
  def inc 
    p value
    value = value + 1 
  end
end

v = Val.new(1)
v.inc

输出将是:

1
undefined method `+' for nil:NilClass (NoMethodError)

value 显然不为零时,为什么我会收到此错误?有没有办法让这个工作?

【问题讨论】:

    标签: ruby


    【解决方案1】:
    Val = Struct.new(:value) do
      def inc 
        p value # here it still prints 1
    
        # but here you REDEFINED what value is. It is now a local variable!
        # Also its initial value is nil, hence the error you're getting.
        value = value + 1 
    
        # should have used this instead, to reference the method
        self.value = value + 1
      end
    end
    

    【讨论】:

      【解决方案2】:

      澄清塞尔吉奥的回答。

      inc的定义中,最初没有变量valuep value调用的是方法value,它返回1

      然后在value = value + 1行中,当value =被解析时,创建一个局部变量value并初始化为nil。即使value + 1 在将其值分配给新创建的value 之前进行评估,value 的初始化也会首先发生。因此,当要评估value + 1 时,已经有一个局部变量value,它的调用优先级高于方法value。而这个值为nil

      【讨论】:

      • 我唯一剩下的困惑是:为什么是“自我”。不像通常那样暗示?该规则一般不适用于赋值语句吗?
      • 如果方法调用(带有隐式self 接收器)优先于局部变量,则无法调用该变量。
      • 好吧,如果您不允许使用本地变量遮蔽方法名称,它可能会起作用,对吧?但我明白你的意思
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-11-05
      • 2021-12-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多