Rails和类变量
class MainController < ApplicationController @my_var = 123 def index var1 = @my_var end def index2 var2 = @my_var end end
为什么var1
没有var2
等于123
?
带@
的变量是ruby中的实例变量。 如果你正在寻找类变量,它们的前缀是@@
,所以你应该使用@@my_var = 123
。
并且你不能以这种方式使用实例变量的原因是因为如果你在方法之外定义实例变量,它们与你的方法不在同一个范围内,而只在你的类被解释时才存在。
您的示例中的var1
是一个局部变量,它只能在index
方法中可见。
例子:
class Foo @@class_variable = "I'm a class variable" def initialize @instance_variable = "I'm an instance variable in a Foo class" local_variable = "I won't be visible outside this method" end def instance_method_returning_an_instance_variable @instance_variable end def instance_method_returning_a_class_variable @@class_variable end def self.class_method_returning_an_instance_variable @instance_variable end def self.class_method_returning_a_class_variable @@class_variable end end Foo.new => # Foo.new.instance_method_returning_an_instance_variable => "I'm an instance variable in a Foo class" Foo.new.instance_method_returning_a_class_variable => "I'm a class variable" Foo.class_method_returning_an_instance_variable => nil Foo.class_method_returning_a_class_variable => "I'm a class variable"
示例代码中的@my_var
是MainController
类上的实例变量。 也就是说,它是类级实例变量,而不是实例级实例变量。 它存在于与类实例关联的实例变量的完全不同的范围内。
在实例方法( index
和index2
的主体中,您试图取消引用作为类MainController
实例的对象的实例变量,但是您没有在任何地方定义该实例变量,因此您返回nil
。
如果要将@my_var
用作类级实例变量,可以从类的实例中获取其值,如下所示:
var1 = self.class.instance_variable_get(:@my_var)
类变量用@@
前缀表示,并不完全鼓励使用它们。 与Google分享几分钟即可告诉您原因。
因为代码在不同的上下文中执行 你可以在这里看到:
class MainController puts self def print_self puts self end end #=> MainController MainController.new.print_self #=>
正如你在第一次打印中看到的那样,self是MainController
,在第二次打印中self是从MainController
类派生的对象。
在@my_vay的赋值中,此变量属于MainController,在第二种情况下,@ my_var属于对象(不是类),这些变量是不同的。