attr_accessor的实现

时间:2017-09-30 07:33:07

标签: ruby

请原谅我的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"?

我是红宝石的初学者。

提前致谢!

1 个答案:

答案 0 :(得分:1)

当你调用name =时,你隐含地声明了新的局部变量。试试这个:

def process
  name = 'Akshay'
  puts local_variables.inspect
end

为什么这种方式是一个复杂的问题,在那里和这里多次讨论过。 setter总是需要明确的接收器。周期。

一旦在方法中有了行name = 'Akshay',你就会引入一个新的局部变量,并且这个方法的范围会扩展为新的局部变量name,尽管如此声明。它基本上由 ruby​​解析器完成。

局部变量优先于实例方法。这就是为什么在最后一行返回的是一个局部变量。由于上述虚假情况,显然没有设定。因此nil