【问题标题】:Reading instance variables using self使用 self 读取实例变量
【发布时间】:2013-12-09 23:54:03
【问题描述】:

我知道在类实例中我应该通过实例变量读取变量的值。 但是通过 self 阅读它们的后果是什么?

请看下面的例子:

class Test   attr_writer :aa
  def testing
    puts @aa
    puts self.aa <-- what are the consequences if I apply attr_reader :aa and try to read 'aa' via self.aa ? can I read other value by accident?
  end

  def self.bb
    a = self.new
    a.aa = "111"
    a.testing
  end
end

Test.bb

【问题讨论】:

  • puts self.aaputs aa 相同。那是因为self 是默认接收者。因为testing是一个实例方法,它被Test的一个实例调用,所以self等于方法中的那个实例。您可以通过在方法中添加puts "self = #{self}" 来确认。 puts aa(或puts self.aa)的效果取决于您是否为aa(例如attr_reader :aa)创建了访问器。如果你有,puts aa 将通过访问器给出@aa 的值;如果没有,则会引发异常,通知您没有局部变量或方法aa
  • 好的,任何特殊原因:“但是出于各种原因,建议使用该方法而不是@variable。” ?

标签: ruby instance-variables class-variables


【解决方案1】:

在您的示例中,该变量是您刚刚使用 self.new 创建的对象的实例变量

同样重要的是要知道在testing 方法中自引用对象而不是你认为的类。而在bob 方法中,由于它是一个类方法,所以对类的自引用。

不过,您可以在类本身中包含实例变量(不要与在所有类对象和类本身中都可以访问的类变量 @@ 混淆)。

这是它的外观示例。

class Test

  class << self
    attr_writer :bb
  end

  def self.bb
    @bb
  end
end

Test.bb = 1
Test.bb

【讨论】:

  • 谢谢我已经编辑了我的帖子并将“类”更改为“实例”
  • 好吧,我明白你写的,也明白其中的区别,但我只是想知道如果我在测试方法中尝试使用 self.aa 而不是 @aa 来读取变量会出现什么问题
  • 如果您使用 attr_reader :aa 与使用 def aa; @aa; end 之类的方法相同,因此几乎相同。但是出于各种原因,建议使用该方法而不是@variable。
猜你喜欢
  • 2010-12-14
  • 1970-01-01
  • 2018-12-15
  • 2012-02-15
  • 1970-01-01
  • 2018-08-26
  • 1970-01-01
  • 2012-05-02
  • 1970-01-01
相关资源
最近更新 更多