请原谅我的noob问题。请解释下面ruby程序的输出以实现attr_accessor。
class SimpleService
attr_accessor :name
def initialize(name)
@name = name
end
def process
if false # some condition met
name = 'Akshay'
end
name
end
end
当我执行这个类时
SimpleService.new('John Doe').process
=> nil
为什么结果为零?
当我明确地使用self命名
时 def process
if false # some condition met
self.name = 'Akshay'
end
name
end
现在输出
SimpleService.new('John Doe').process
=> "John Doe"
为什么现在结果" John Doe"?
我是红宝石的初学者。
提前致谢!
答案 0 :(得分:1)
当你调用name =
时,你隐含地声明了新的局部变量。试试这个:
def process
name = 'Akshay'
puts local_variables.inspect
end
为什么这种方式是一个复杂的问题,在那里和这里多次讨论过。 setter总是需要明确的接收器。周期。
一旦在方法中有了行name = 'Akshay'
,你就会引入一个新的局部变量,并且这个方法的范围会扩展为新的局部变量name
,尽管如此声明。它基本上由 ruby解析器完成。
局部变量优先于实例方法。这就是为什么在最后一行返回的是一个局部变量。由于上述虚假情况,显然没有设定。因此nil
。