以下是Trying to learn / understand Ruby setter and getter methods的引用:
你的例子中发生的事情是你正在初始化一个新对象(Human.new),然后使用一个方法(noise =,是方法名称包含=符号),恰好定义了一个实例变量(即,仅适用于该实例的变量),然后最后使用另一个方法调用检索该实例变量。
问题:为什么有必要使用另一个方法调用来检索实例变量?我在Ruby中读到了所有实例变量都是私有的。这是否意味着当焦点传递给另一个实例/对象时,实例变量被破坏和/或不可访问,因此需要方法调用?
答案 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内容并进行更改。