14

考虑以下示例 ruby​​ 类

class User
  def hello
    puts "hello"
  end
end

现在,用于初始化。有两种方法

正常变量

1.9.3p125  > tr = User.new
 => #<User:0x98778c4>
1.9.3p125  > tr.hello
 Hello world
 => nil`

实例变量:

1.9.3p125 > @tr = User.new
 => #<User:0x9890f2c>
1.9.3p125 > @tr.hello
Hello world
 => nil

现在,在这两种情况下,它的工作原理都是一样的。那么普通变量与实例变量有什么区别?

4

3 回答 3

35

普通变量仅在当前上下文中具有作用域;一个实例变量的作用域贯穿于一个类的一个实例中。在您的情况下,他们感到困惑,因为上下文是main,它充当Object.

考虑以下内容,这可能会使事情更清楚

class User
  def set_name
    @name = "Bob"
    surname = "Cratchett"
  end

  def hi
    puts "Hello, " + @name
  end

  def hello
    puts "Hello, Mr " + surname
  end
end

irb(main):022:0> u = User.new
=> #<User:0x29cbfb0>
irb(main):023:0> u.set_name
irb(main):024:0> u.hi
Hello, Bob
=> nil
irb(main):025:0> u.hello
NameError: undefined local variable or method `surname' for #<User:0x29cbfb0 @name="Bob">
于 2012-04-23T12:52:53.860 回答
4

普通变量称为局部变量,并且对于定义它的代码结构是局部的(如果您在方法中定义它,则无法在该方法之外访问它)。

实例变量是对象的特定实例的局部变量。如果一个对象更改了实例变量的值,则该更改仅针对该对象发生。

类的所有实例也有本地类变量:

@@class_variable = 'a class variable'

并且可以从程序中的任何位置访问全局变量:

$global_variable = 'a global variable'

于 2012-04-23T12:48:42.850 回答
2

局部变量只能在定义它的方法中使用(或者,当变量在顶层定义时,只能在任何方法之外)。实例变量可以从在同一实例上调用的任何方法中使用。

这是一个您可以看到差异的示例:

@tr = User.new

def foo
  @tr.hello
end

foo
# Hello World


tr = User.new

def bar
  tr.hello
end

bar
# Exception because tr is not accessible from within bar
于 2012-04-23T12:48:34.417 回答