正常变量与Ruby中的实例变量有什么不同?

考虑以下示例ruby类

class User def hello puts "hello" end end 

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

正常变量

 1.9.3p125 > tr = User.new => # 1.9.3p125 > tr.hello Hello world => nil` 

实例变量:

 1.9.3p125 > @tr = User.new => # 1.9.3p125 > @tr.hello Hello world => nil 

现在,在这两种情况下它都是一样的。 那么正常变量和实例变量有什么区别?

普通变量仅在当前上下文中具有范围; 实例变量在类的一个实例中具有范围。 在你的情况下,他们感到困惑,因为上下文是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 => # 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 # 

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

实例变量是对象的特定实例的本地变量 。 如果一个对象更改了实例变量的值,则仅对该对象进行更改。

类的所有实例都有本地类变量

@@class_variable = 'a class variable'

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

$global_variable = 'a global variable'

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

这是一个可以看出差异的例子:

 @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