自定义结构体方法无法设置结构体成员

3
一个示例会解释这个问题:
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`明显不为空时,为什么会出现此错误?是否有办法使其正常工作?
2个回答

5
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

4

对Sergio的回答进行澄清。

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

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


我仅剩的困惑是:为什么“self.”不像通常情况下那样被隐含呢?这个规则是否普遍适用于赋值语句? - Jonah
1
如果一个带有隐式 self 接收器的方法调用优先于一个局部变量,那么就没有办法调用该变量。 - sawa
好的,如果您禁止使用本地变量来遮蔽方法名称,那么这可能会起作用,对吧?但我理解您的意思。 - Jonah

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接