不好意思,对于noob question.Please,请解释一下用于实现attr_accessor的以下ruby程序的输出。
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"为什么现在的结果是“无名氏”?
我是红宝石的初学者。
提前感谢!
发布于 2017-09-30 08:20:26
问题是,当您调用name =时,您会隐式声明新局部变量。试试这个:
def process
name = 'Akshay'
puts local_variables.inspect
end为什么会这样呢?这是一个复杂的问题,在这里讨论了很多次。策划人总是要求在明确的接受者。句号。
一旦在方法中包含了行name = 'Akshay',就会引入一个新的局部变量,并且这个方法的作用域将被扩展到新的局部变量name,尽管它是如何声明的。它基本上是由ruby解析器完成的。
局部变量优先于实例方法。这就是为什么在最后一行中返回的是一个局部变量。这显然没有设定,因为上面的弗尔赛条件。因此,nil。
https://stackoverflow.com/questions/46500598
复制相似问题