Ruby实例变量和方法

时间:2011-05-18 01:29:46

标签: ruby instance-variables

有时我看到一个实例变量定义为@my_variable。但是,有时我会看到self.my_variable。何时使用?

3 个答案:

答案 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_readerattr_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_readerattr_accessor定义。

面向对象编程的一个目的是将特定事物封装到该实例内的实例中,并使其从外部无法访问。这样,您可以避免不必要的名称冲突。对于实例变量也是如此。它们通常是在实例中被操作的参数,不能在它之外使用。

在一个实例中,可以直接引用它的实例变量,因此不需要通过方法调用来引用它们。您应该直接调用变量@myVariable

从实例外部,由于上述原因,您无法直接引用实例变量。但有时候,你确实需要参考它们。使用方法myVariable的目的是从实例外部引用实例变量。

答案 2 :(得分:0)

@my_variable直接引用实例变量,并且(大部分)从该实例外部无法访问。

self.my_variable正在使用访问者方法(内部使用attr_readerattr_writerattr_accessor定义。这是在可能名为@my_variable的实例变量(与ActiveRecord模型属性一样)或内部状态与公开公开的内容不同。