我对ruby rails不熟悉,我正努力了解实例变量的用途。
将变量变成实例变量有什么意义?
基本上我为什么要这样做:
class User
def initialize(var1)
@name = var1
end
end
对此:
class User
def initialize(var1)
name = var1
end
end
在什么类型的情况下,我只想在常规变量上使用实例变量?
答案 0 :(得分:0)
实际用途是,如果您需要一个变量来在函数调用之间持久存在,请将其设置为实例变量。
定义实例变量后,可以在另一个函数上调用此值,您将获得该值。
通常,实例变量是局部变量,并且持久化在对象的实例内部,而局部变量只是局部变量,并且持久化在函数/对象/块作用域之内。
在您的示例中,如果您的用户类上还有其他方法,则可以在该其他方法上使用@name的值,但不能在initialize方法之外使用var1。
class User
def initialize(var1)
@name = var1
end
def greetings
"hello #{@name}"
end
end
答案 1 :(得分:-1)
class People
def age
@age
end
def age= age
@age = age
end
end
def show people
age = people.age || '22'
p "Hello, my age is #{age}"
end
people = People.new
show people
=> 'Hello, my age is 22'
age
=> NameError: undefined local variable or method 'age' for main:Object
user.age = 21
greet people
=> 'Hello, my age is 21'
@age
=> nil
请注意,尽管这两种变量类型都是特定上下文的局部变量。 @age是在people实例中定义的,因此,当您调用people.age时,您将在其中定义了@age的age实例中调用age函数。年龄仅在show函数中定义,因此,当您调用p“你好,我的年龄是#{age}”时,由于处于定义范围内,因此可以获取年龄值。
答案 2 :(得分:-2)
因为实例变量可以被视图代码访问,包括在表单内以及将数据传递到路径。对于他们来说,这可能是最常见的实际用例。在您的示例中,我可以执行以下操作:
<p>User: <%= "#{@name}" %></p>
而且,您不会在呈现的H.T.M.L的相应段落中看到“ @name”,而是看到了该实例变量的值-反之:
<p>User: <%= "#{name}" %></p>
...据此,由于未定义“名称”,可能会导致ActionView错误。