请考虑以下代码.
class A
attr_reader :n
def initialize
@n = 1
end
def set_local_n
n = 10
end
def using_field_reader_locally
n + 100
end
def using_field_reader_to_set_local_x
x = n + 1000
end
def using_field_reader_to_set_local_n
n = n + 1000 # This line raises a NoMethodError. Why?
end
end
Run Code Online (Sandbox Code Playgroud)
为什么注释行会产生错误?为什么Ruby不允许设置局部变量,n在这种情况下,使用包含与本地变量同名的字段阅读器的表达式?为什么所有其他实例方法都会运行而没有任何问题但会using_field_reader_to_set_local_n产生错误.
请注意,我不打算定义n在本地using_field_reader_to_set_local_n与涉及本地定义的表达n中set_local_n.我打算在n本地定义using_field_reader_to_set_local_n一个涉及现场读者的表达@n.定义set_local_n用于显示n可以在名为field的字段阅读器n存在的情况下在本地定义.
如果你仔细一看,NoMethodError是不是那里是没有方法n,但方法+的NilClass.
在这个声明中:
n = n + 1000
Run Code Online (Sandbox Code Playgroud)
Ruby必须决定什么n.当你为它分配东西时(n =)它不是一种方法.如果要调用该n=方法,则必须指定显式接收器(self.n =).
所以它必须是一个变量.在这种情况下局部变量.
现在要弄清楚:
n = n
Run Code Online (Sandbox Code Playgroud)
Ruby最终分配nil给n.这与内部必须为正在分配的变量名称放置占位符有关.
所以当你这样做时:
n = n + 1000
Run Code Online (Sandbox Code Playgroud)
会发生什么:
n使用占位符值(nil)创建一个新的局部变量.nil + 1000.nil没有+方法所以会引发错误.要执行您想要执行的操作,您必须显式引用实例变量的值:
n = @n + 1000
Run Code Online (Sandbox Code Playgroud)
或者显式调用属性读取器:
n = self.n + 1000
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
44 次 |
| 最近记录: |