考虑以下示例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
现在,在这两种情况下它都是一样的。那么正常变量和实例变量之间的区别是什么?
答案 0 :(得分:31)
正常变量仅在当前上下文中具有范围;实例变量在类的一个实例中具有范围。在您的情况下,他们会感到困惑,因为上下文是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">
答案 1 :(得分:4)
普通变量称为局部变量,并且是定义它的代码构造的本地变量(如果在方法中定义它,则无法在该方法之外访问它)。
实例变量是对象的特定实例的本地变量。如果一个对象更改了实例变量的值,则仅对该对象进行更改。
该类的所有实例都有类变量:
@@class_variable = 'a class variable'
全局变量可从程序中的任何位置访问:
$global_variable = 'a global variable'
答案 2 :(得分: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