Getters,Setters和Instance Variables

时间:2012-12-18 00:12:50

标签: ruby getter-setter

以下是Trying to learn / understand Ruby setter and getter methods的引用:

  

你的例子中发生的事情是你正在初始化一个新对象(Human.new),然后使用一个方法(noise =,是方法名称包含=符号),恰好定义了一个实例变量(即,仅适用于该实例的变量),然后最后使用另一个方法调用检索该实例变量。

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

3 个答案:

答案 0 :(得分: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"

使用其他方法的目的只是在以后想要访问变量时。

答案 1 :(得分:0)

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

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

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

答案 2 :(得分: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'

你会看到类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内容并进行更改。