Ruby:从内部方法访问 attr_accessor 的方法

标签 ruby attr-accessor

我有一个代码:

class A
  attr_accessor :somevar

  def a
    somevar = 'something'
    puts @somevar
  end

  def b
    send :somevar=, 'something'
    puts @somevar
  end

end

A.new.a #=> nil
A.new.b #=> 'something'

为什么会有差异?为什么我不能通过编写器分配一个实例变量?但是为什么创建了局部变量而不是调用了方法(setter)呢?

最佳答案

attr_accessor :somevar 引用instance 变量@somevar。实例变量前面必须有 @ 符号。方法中没有 @ 符号的所有其他变量(如“somevar”)只是该方法或范围的局部变量,而不是对象的实例变量。

因此,将方法“a”中的第一行更改为

@somevar = 'something'

将得到您期望的答案。

相关说明:您不必在 Ruby 中声明实例变量,您只需使用 @somevar 类型表示法创建它们。 attr_accessor 方法为该实例变量创建 setter 和 getter。

Ruby 中的方法附加到对象,所以为了让类 A 调用它自己的 somevar setter 方法,您需要编写 self.somevar = 'something',否则 Ruby 解析器认为您只是在创建一个局部变量。

这可能会造成混淆,因为您可以从 b 调用方法 a,只需执行以下操作:

def b
  send :somevar=,'something'
  puts @somevar
  a  # would invoke its own method 'a'
end

但是 setter 方法 somevar= 对于创建具有相同符号的局部变量是不明确的:

somevar='something'  # Ruby assumes you want to create a local variable

因此,要调用 somevar setter 方法,您需要明确说明您正在调用 self 方法:

self.somevar = 'something'

当您调用 send :somevar=,'something' 时,您也在调用 somevar 实例方法。

关于Ruby:从内部方法访问 attr_accessor 的方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10913544/

相关文章:

ruby-on-rails - Rails 模型 attr_accessor 属性没有保存?

Ruby attr_accessor 包装器返回 nil。

ruby-on-rails - Rails 中的尺寸、长度和数量

ruby-on-rails - 如何在 Rails 中查找 ID 从一个数字到另一个数字的所有对象?

Ruby 相当于 Ipython %timeit

ruby-on-rails - 使用动态 fields_for 发送键数组

ruby-on-rails - 自动化网站交互 - Mechanzie - Rails

ruby-on-rails - 向 ActiveRecord 对象添加附加数据

ruby 镐书说 attr_accessor 是类方法

ruby-on-rails - 了解 Ruby on Rails ActiveRecord 模型访问器