鉴于此代码:
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默认的接收器吗?
你没有在那里调用这个方法,你实际上是在引用你正在定义的同一个变量!这是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方式",但是如果你有一个同名的局部变量,你仍然可以通过这种方式调用方法,这仍然很有趣.
my_variable = my_variable + 3
Run Code Online (Sandbox Code Playgroud)
...是一个局部变量赋值,它优先.
因此需要self- 以便将其范围扩展到对象.
| 归档时间: |
|
| 查看次数: |
84 次 |
| 最近记录: |