我正在使用Ruby on Rails 3,我想知道在什么情况下我应该使用实例变量而不是其他变量类型,如果有安全原因那些。
示例:
# Using an instance variable
@accounts = Account.find(...)
# Using a "local"\"normal" variable
account = Account.find(...)
答案 0 :(得分:10)
@Pan的回答很好地解释了它们之间的区别。
通常(几乎任何语言)您都希望在所需的最小范围内定义变量。因此,如果您不需要在函数调用之间保留某些内容,请将其设置为本地。
如果需要在函数调用之间保持变量,但仅针对特定的类实例,请将其设为实例变量。
如果您需要在该类的每个实例之间共享某些内容,那么请使用类变量,但是对此的需求应该有点罕见,因此请仔细考虑是否确实需要类变量
(免责声明:我只使用Ruby大约2周,所以这主要是语言无关的答案,但我很确定它适用于Ruby。如果我错了,请随意纠正我。)
答案 1 :(得分:9)
通常,实例变量是本地的并且持久存储在对象的实例中,而局部变量只是本地变量并且持久存储在函数/对象/块范围内。例如:
class User
def name
@name
end
def name= name
@name = name
end
end
def greet user
name = user.name || 'John'
p "Hi, my name is #{name}"
end
user = User.new
greet user
=> 'Hi, my name is John'
name
=> NameError: undefined local variable or method 'name' for main:Object
user.name = "Mike"
greet user
=> 'Hi, my name is Mike'
@name
=> nil
在greet函数中,name
是一个仅在该函数中定义的局部变量。 name变量在函数name = user.name || 'John'
的第一行上设置,但其值不会在函数外部持久化。当您尝试调用name
时,您会得到一个NameError
,因为名称只被定义为greet函数中的局部变量。
@name
是User类的用户实例的本地。当您尝试在该上下文之外调用它时,您将获得nil
。这是本地变量和实例变量之间的一个区别,如果尚未定义实例变量则返回nil,而本地非实例变量会引发错误。
请注意,两种变量类型都是特定上下文的本地变量。 @name
是在用户实例中定义的,因此当您调用user.name
时,您正在调用用户实例中的name函数,其中定义了@name
。 name
仅在greet函数中定义,因此当您调用p "Hi, my name is #{name}"
时,您可以获得name
的值,因为您处于定义范围内。