2011-04-29 46 views
3

在下面的代码,“self.included?”在Ruby中

module Test 
    @connection = nil 
    def self.included?(base) 
    @connection = base 
    end 

    def print 
    puts @connection 
    end 
end 

class ModuleTest 
    include Test 
end 

m = ModuleTest.new 
m.print 

为什么@connection零打印时?

+1

你真的想'@connection = base'更有意义,还是你的意思是'@connection == base'?有一个方法以一个问号结束并且总是返回值,这似乎很奇怪。 – Phrogz 2011-04-29 16:02:10

回答

4

当您运行print时,它将打印ModuleTest实例的实例变量@connection。您的代码中有两个其他地方指的是@connection,但这些地方指向Class类的实例ModuleTest的实例变量@connection,它们是不同的。

此外,即使是后者@connectionModuleTest类的一个)也没有获得其值base,直到您执行included?

创建的实例ModuleTest的实例变量因此被默认初始化为nil,当由putsprint内调用时。

4

差不多吧,有一对夫妇的调整的工作原理:

module Test 
    def self.included(base) 
    @@connection = base 
    end 

    def print 
    puts @@connection 
    end 
end 

class ModuleTest 
    include Test 
end 

ModuleTest.new.print 

问题:

  1. 回调包括没有
  2. 在类的方法,它使得使用类变量不是实例变量
+1

我一直都认为由于潜在的不可预知的行为,类变量被忽视。如果我需要在实例中获取该变量,我更喜欢在类上使用实例变量,然后使用self.class.instance_variable_get(:@ my_var)。这是更多的代码,但更可预测。 – 2011-04-29 04:42:32

+0

@Beerlington - 我也读过,但只是作为观点,没有任何坚实的例子。你能链接到解释不可预知的行为的博客帖子/问题吗?事后看来,类也是Ruby中的对象,所以理想情况下,我们不应该有太多问题。 – Swanand 2011-04-29 05:52:34

+0

@Swanand - 只要做一个谷歌搜索的Ruby类变量,你会发现很多的例子。下面是一个关注继承的例子:http://railstips.org/blog/archives/2006/11/18/class-and-instance-variables-in-ruby/另外,如果你喜欢对它感兴趣。 – 2011-04-29 13:32:43