为什么这些方法不能解决?

rye*_*guy 5 ruby

鉴于此代码:

class Something
  attr_accessor :my_variable

  def initialize
    @my_variable = 0
  end

  def foo
    my_variable = my_variable + 3
  end
end

s = Something.new
s.foo
Run Code Online (Sandbox Code Playgroud)

我收到此错误:

test.rb:9:in `foo': undefined method `+' for nil:NilClass (NoMethodError)
    from test.rb:14:in `<main>'
Run Code Online (Sandbox Code Playgroud)

如果attr_accessor创建一个名为my_variable(和.. =)foo的方法,为什么找不到该方法?如果我改成它self.my_variable,它可以工作,但为什么?不是self默认的接收器吗?

Rya*_*igg 7

你没有在那里调用这个方法,你实际上是在引用你正在定义的同一个变量!这是Ruby中的一个小问题.

如果您引用并设置实例变量,那会更好:

@my_variable = @my_variable + 3
Run Code Online (Sandbox Code Playgroud)

或更短:

@my_variable += 3
Run Code Online (Sandbox Code Playgroud)

或者你可以调用setter方法,就像你找到的那样(和Jits指出):

self.my_variable += 3
Run Code Online (Sandbox Code Playgroud)

最后一个将调用my_variable=由其定义的方法attr_accessor,其他两个将仅修改变量.如果您这样做,您可以覆盖my_variable=以执行与传入的值不同的操作:

def my_variable=(value)
  # do something here
  @my_variable = value
end
Run Code Online (Sandbox Code Playgroud)

奖金

或者您可以通过传递一组空参数来显式调用该方法:

my_variable = my_variable() + 3
Run Code Online (Sandbox Code Playgroud)

这不是"Ruby方式",但是如果你有一个同名的局部变量,你仍然可以通过这种方式调用方法,这仍然很有趣.


Jit*_*its 5

my_variable = my_variable + 3
Run Code Online (Sandbox Code Playgroud)

...是一个局部变量赋值,它优先.

因此需要self- 以便将其范围扩展到对象.