实例变量和attr_accessor

时间:2013-08-06 13:06:22

标签: ruby

当我在@foo=3方法中定义initialize时,我希望像这样访问我的变量。

class Object
  def initialize(v)
    @foo = v
  end

  Object.new.foo

但这并没有发生。我需要写attr_accessor :foo。为什么我需要这样做,即使@已经为我做了这个?

5 个答案:

答案 0 :(得分:5)

默认情况下,Ruby中的一个实例变量不是公共的。并且应该基于访问者授予访问权限。

仅限attr_reader 仅限写入attr_writer 读写attr_accessor

默认情况下无法访问

答案 1 :(得分:4)

@不会自动为您执行此操作。这就是为什么。 attr_accessor为您的实例变量创建getter和setter(“@ -variables”)。

答案 2 :(得分:3)

实例变量是私有的。您需要访问器和更改器才能访问它们。常见的访问者/ mutator对看起来像:

def foo
  @foo
end

def foo=(value)
  @foo=value
end

这会创建一个抽象,您现在可以将其用作:

Classname.new.foo
Classname.new.foo="OOP"

由于这是一个常见的需求,并且在很多样板文件(读取:不必要的)代码中都有用,因此ruby提供了一种动态方法,可以为你定义这两种方法。

attr_accessor :foo

如果您只想使用accessor或mutator方法之一,请使用以下相应的内容:

attr_reader :foo
attr_writer :foo

这将节省大量的复制/粘贴。我希望我很清楚。

答案 3 :(得分:1)

所有 Ruby属性都是“私有的”,并且在类的方法之外是不可见的。您需要访问器方法来读取和写入属性。因此,在您的示例中,您需要

class MyClass

  def initialize(v)
    @foo = v
  end

  def foo
    @foo
  end

  def foo=(v)
    @foo = v
  end

end

然后MyClass.new(4).foo将有效,并返回4

您还可以使用便捷方法

添加访问者方法
attr_reader   :foo
attr_writer   :foo

attr_accessor :foo

答案 4 :(得分:0)

实例变量以@字符开头。所有实例变量都是私有的,这意味着您无法读取它们,也无法更改它们的值。那么该怎么办?

class Dog
  def initialize(name)
    @name = name
  end

  def name    #getter
    @name
  end

  def name=(str)  #setter
    @name = str
  end
end

嗯,输入会很麻烦,所以ruby提供了一个捷径:

class Dog
  attr_accessor :name

  def initialize(name)
    @name = name
  end
end