2016-02-05 48 views
1

這是ActiveSupport::InflectorString#dasherize第一個參數:利用自身在紅寶石實例方法

def dasherize(underscored_word) 
    underscored_word.tr('_', '-') 
end 

它取代了與破折號的字符串下劃線。

'puni_puni'.dasherize # => "puni-puni" 

接收器被用作該方法的唯一參數。

ActiveSupport::Inflector.dasherize(puni_puni) # => "puni-puni" 

當我試圖做同樣的事情,這是行不通的:

module NewDash 
    def new_dasherize(underscored_word) 
     underscored_word.tr('_', '-') 
    end 
end 

String.include NewDash 

t = "t_e_s_t" 
t.new_dasherize # => ArgumentError: wrong number of arguments (0 for 1) 
t.new_dasherize(t) # => "t-e-s-t" 

我怎麼能複製這種行爲,什麼是它的技術術語?

回答

1

您可以在幾個不同的方式做到這一點。 LcLk提到了一種方法,在參數列表中將self設置爲underscored_word的默認值。另一種方式是通過引用自直接

module NewDash 
    def new_dasherize 
    self.tr('_', '-') 
    end 
end 

String.include NewDash 

運行後,您可以在字符串本身直接調用new_dasherize

>> 'puni_puni'.new_dasherize 
=> "puni-puni" 

可以達到同樣的事情,ActiveSupport風格,這

class String 
    def new_dasherize 
    self.tr('_', '-') 
    end 
end 

這就是ActiveSupport所做的事情,打開String類(check it out)並添加一些方法。他們只是碰巧這個dasherize方法的實現委託給ActiveSupport::Inflections

如果你看看Here,你會看到ActiveSupport真正實現他們的dasherize方法。

技術術語可能是「延伸對象」,儘管我對此並不積極。

5

嘗試寫這樣

def new_dasherize 
    tr('_', '-') 
end 

它作爲self.tr('_', '-')一樣,在這裏self是在這種情況下String類的實例。

0

我不知道這樣做的傳統方式是,但你基本上找的是使t可選參數傳送給new_dasherize,並給它的self默認值時,它不是提供。

module NewDash 
    def new_dasherize(underscored_word = self) 
    underscored_word.tr('_', '-') 
    end 
end 

這是一個毫無意義的默認,因爲它只是工作,如果self就像對象的字符串這是爲了響應tr。我建議添加一些驗證或類型轉換,或者至少提供可靠的文檔來解釋模塊的具體用例。

2

有沒有這樣做的神奇方式。如果你看裏面0​​你可以看到,積極支持重新打開String類和不

class String 
    def dasherize 
    ActiveSupport::Inflector.dasherize(self) 
    end 
end