0

这是尝试学习/理解 Ruby setter 和 getter 方法的引述:

您的示例中发生的情况是您正在初始化一个新对象(Human.new),然后使用恰好定义实例变量(即,仅用于该实例的变量),然后最终使用另一个方法调用检索该实例变量。

问题:为什么需要用另一个方法调用来检索实例变量?我在某个地方读到了 Ruby 中的所有实例变量都是私有的。这是否意味着当焦点传递到另一个实例/对象时,实例变量被破坏和/或不可访问,因此需要方法调用?

4

3 回答 3

1

它不是真的。设置某些内容时,将返回新值。例如:

foo = 'bar' #=> "bar"

还:

class Foo
  def bar=(obj)
    @bar = obj
  end
  def bar
    @bar
  end
end

f = Foo.new
f.bar = "FOO" # returns "FOO"
f.bar         # Now also returns "FOO"

使用另一种方法的目的只是当您想稍后访问该变量时。

于 2012-12-18T01:09:42.810 回答
0

如果您愿意,您可以选择公开实例变量,ruby 提供以下语法:

class Foo
  attr_reader :bar

  def initialize(bar)
    @bar = bar
  end
end

foo_instance = Foo.new('some_value')
puts foo_instance.bar # => 'some_value'

您将在 class Foo 行下看到 attr_reader,这使得 @bar 的任何值都是可检索的。

您还可以打开实例变量以进行修改:

  class Foo
    attr_accessor :bar

    def initialize(bar)
      @bar = bar
    end
  end

 foo_instance = Foo.new('some_value')
 puts foo_instance.bar # => 'some_value'
 foo_instance.bar = 'another_value'
 puts foo_instance.bar # => 'another_value'

这是使用 attr_accessor 完成的,让您可以查看 @bar 内容并对其进行更改。

于 2012-12-18T18:19:37.763 回答
0

私有实例变量无法从其实例外部访问。

这通常很有用,因为它允许您的类跟踪其他对象不应该看到的内部状态。但是,如果您希望允许其他对象从您的类的实例中检索值,您可以提供一个 getter 方法来公开该值。

从 getter 访问值的对象通常与最初设置这些值的对象不同。例如,我们可以将这个问题表示为一个对象。德鲁设置了问题的文本。现在这个问题不是很有用,除非我们其他人也有办法获得问题的文本以便我们阅读它。如果没有 getter,我们不太可能创建有用的答案对象。甚至 Drew 也可能想使用那个 getter,因为 Andrew 出现并编辑了问题,而 Drew 可能想知道下一个文本是什么样的。

于 2012-12-18T01:15:31.623 回答