-1

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

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

  Object.new.foo

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

4

5 回答 5

5

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

只读 只attr_readerattr_writer 读写attr_accessor

默认情况下无法访问

于 2013-08-06T13:09:07.717 回答
4

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

于 2013-08-06T13:09:10.003 回答
3

实例变量是私有的。你需要访问器和修改器来访问它们。一个常见的访问器/修改器对如下所示:

def foo
  @foo
end

def foo=(value)
  @foo=value
end

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

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

由于这是一种常见的需求,并且会产生大量的样板(阅读:不必要的)代码,因此 ruby​​ 提供了一个动态方法,它为您定义了这两种方法。

attr_accessor :foo

如果您只需要访问器或修改器方法之一,请使用以下对应的方法:

attr_reader :foo
attr_writer :foo

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

于 2013-08-06T13:27:30.667 回答
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
于 2013-08-06T14:17:21.487 回答
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
于 2013-08-06T13:35:11.307 回答