2011-04-29 45 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