有时我看到一个实例变量定义为@my_variable
。但是,有时我会看到self.my_variable
。何时使用?
答案 0 :(得分:12)
实例变量(@variable
)对应于其他语言中的私有变量。 self.myvariable
实际上不是变量,而是对方法的调用。同样,如果您编写self.myvariable = something
,则实际上是对self.myvariable=(something)
的调用。这与使用其他语言的getter和setter的属性相对应。
class Foo
def initialize
@bar = 42
end
def xyzzy
123
end
def xyzzy=(value)
puts "xyzzy set to #{value}!"
end
end
obj = Foo.new
puts obj.xyzzy # prints: 123
obj.xyzzy = 2 # prints: xyzzy set to 2
puts obj.bar # error: undefined method 'bar'
您可以使用attr_reader
和attr_accessor
自动为实例变量定义getter和setter。 attr_reader
只生成一个getter,而attr_accessor
生成两者。
class Parrot
attr_accessor :volts
def voom
puts "vooming at #{@volts} volts!"
end
end
polly = Parrot.new
polly.volts = 4000
polly.voom
答案 1 :(得分:1)
实例变量比调用它们的方法更重要。在self.myVariable
中,myVariable
是引用实例变量@myVariable
的方法,该方法通常由attr_reader
或attr_accessor
定义。
面向对象编程的一个目的是将特定事物封装到该实例内的实例中,并使其从外部无法访问。这样,您可以避免不必要的名称冲突。对于实例变量也是如此。它们通常是在实例中被操作的参数,不能在它之外使用。
在一个实例中,可以直接引用它的实例变量,因此不需要通过方法调用来引用它们。您应该直接调用变量@myVariable
。
从实例外部,由于上述原因,您无法直接引用实例变量。但有时候,你确实需要参考它们。使用方法myVariable
的目的是从实例外部引用实例变量。
答案 2 :(得分:0)
@my_variable
直接引用实例变量,并且(大部分)从该实例外部无法访问。
self.my_variable
正在使用访问者方法(内部使用attr_reader
,attr_writer
或attr_accessor
定义。这是在可能名为@my_variable
的实例变量(与ActiveRecord模型属性一样)或内部状态与公开公开的内容不同。