首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >attr_accessor的实现

attr_accessor的实现
EN

Stack Overflow用户
提问于 2017-09-30 07:33:07
回答 1查看 72关注 0票数 0

不好意思,对于noob question.Please,请解释一下用于实现attr_accessor的以下ruby程序的输出。

代码语言:javascript
复制
  class SimpleService

        attr_accessor :name

        def initialize(name)
          @name = name
        end

        def process
          if false # some condition met
            name = 'Akshay'
          end
          name
        end
      end

当我执行这个类时

代码语言:javascript
复制
      SimpleService.new('John Doe').process
      => nil

为什么结果为零?

当我使用self显式命名时

代码语言:javascript
复制
    def process
        if false # some condition met
          self.name = 'Akshay'
        end
        name
      end

现在输出是

代码语言:javascript
复制
    SimpleService.new('John Doe').process
    => "John Doe"

为什么现在的结果是“无名氏”?

我是红宝石的初学者。

提前感谢!

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-09-30 08:20:26

问题是,当您调用name =时,您会隐式声明新局部变量。试试这个:

代码语言:javascript
复制
def process
  name = 'Akshay'
  puts local_variables.inspect
end

为什么会这样呢?这是一个复杂的问题,在这里讨论了很多次。策划人总是要求在明确的接受者。句号。

一旦在方法中包含了行name = 'Akshay',就会引入一个新的局部变量,并且这个方法的作用域将被扩展到新的局部变量name,尽管它是如何声明的。它基本上是由ruby解析器完成的。

局部变量优先于实例方法。这就是为什么在最后一行中返回的是一个局部变量。这显然没有设定,因为上面的弗尔赛条件。因此,nil

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/46500598

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档