这是尝试学习/理解 Ruby setter 和 getter 方法的引述:
您的示例中发生的情况是您正在初始化一个新对象(Human.new),然后使用恰好定义实例变量(即,仅用于该实例的变量),然后最终使用另一个方法调用检索该实例变量。
问题:为什么需要用另一个方法调用来检索实例变量?我在某个地方读到了 Ruby 中的所有实例变量都是私有的。这是否意味着当焦点传递到另一个实例/对象时,实例变量被破坏和/或不可访问,因此需要方法调用?
这是尝试学习/理解 Ruby setter 和 getter 方法的引述:
您的示例中发生的情况是您正在初始化一个新对象(Human.new),然后使用恰好定义实例变量(即,仅用于该实例的变量),然后最终使用另一个方法调用检索该实例变量。
问题:为什么需要用另一个方法调用来检索实例变量?我在某个地方读到了 Ruby 中的所有实例变量都是私有的。这是否意味着当焦点传递到另一个实例/对象时,实例变量被破坏和/或不可访问,因此需要方法调用?
它不是真的。设置某些内容时,将返回新值。例如:
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"
使用另一种方法的目的只是当您想稍后访问该变量时。
如果您愿意,您可以选择公开实例变量,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 内容并对其进行更改。
私有实例变量无法从其实例外部访问。
这通常很有用,因为它允许您的类跟踪其他对象不应该看到的内部状态。但是,如果您希望允许其他对象从您的类的实例中检索值,您可以提供一个 getter 方法来公开该值。
从 getter 访问值的对象通常与最初设置这些值的对象不同。例如,我们可以将这个问题表示为一个对象。德鲁设置了问题的文本。现在这个问题不是很有用,除非我们其他人也有办法获得问题的文本以便我们阅读它。如果没有 getter,我们不太可能创建有用的答案对象。甚至 Drew 也可能想使用那个 getter,因为 Andrew 出现并编辑了问题,而 Drew 可能想知道下一个文本是什么样的。