2015-10-05 48 views
0

我正在嘗試構建一個可以包含在任何類中的模塊,並且可以直接調用它的方法。直接沒有運算符('。'或'::')的訪問模塊方法

紅寶石colored就是一個很好的例子。例如,我可以在任何地方從Colored模塊調用方法,只需執行諸如puts "I am the color blue!".blue之類的操作即可,但這不是任何類。但我注意到他們調用String.send(:include, Colored)

任何洞察力是讚賞。

目標:

module Example 
    def do_something 
    puts 'foo!' 
    end 
end 

# Instead of calling Example::do_something or Example.do_something, 
# I want to do this: 
do_something # => 'foo!' 

(不正確的方法)

module Example 
    extend self 

    def do_something 
    puts 'foo!' 
    end 
end 

do_something # => undefined local variable or method `do_something' for main:Object (NameError) 

(另一種不正確的方法)

module Example 
    extend self # not sure... 

    def self.do_something 
    puts 'foo!' 
    end 
end 

do_something # => undefined local variable or method `do_something' for main:Object (NameError) 
+0

你說你要定義可以'包括在任何類的模塊,但在你的例子中,你不包括它的地方你想在所有叫它。你真的是指「任何」班嗎?或者你是否真的想讓它成爲_every_課程中的一員?總的來說,你所描述的並不是Ruby ruby​​的工作方式,儘管有很多種方法可以實現它,這取決於你真正想要做什麼。 – jrochkind

+0

@ jrochkind這是一個令人困惑的問題,因爲我很困惑,對不起!請參閱更新的問題。我一直在研究的一個例子是[color gem](https://github.com/defunkt/colored) – binarymason

+2

彩色的寶石猴子補丁(在運行時添加)到String中。注意你實際上不能在任何地方調用它的方法,你必須在String類上調用它們:''一個字符串「.blue','some_string.blue'。這種猴子補丁通常被認爲是一個壞主意。現在還不是你要求的。如果你真的想定義一個可以被稱爲「任何地方」的方法,不要在模塊中定義它,只需在「頂層」上定義它在任何模塊或類之外。但這不是一個好主意,除了不是什麼有色寶石在做什麼,這也不是一個好主意 – jrochkind

回答

3

嘗試runni納克像這樣

module Example 
    def do_something 
    puts 'foo!' 
    end 
end 

include Example 
do_something #=> foo!