2014-05-18 174 views
0

我有一個類,其屬性.weekday保存爲整數值。模塊內的訪問對象屬性

我試圖在模塊中創建一個方法,將該數值轉換爲相應的工作日。

這是我喜歡的工作:

MyClass.weekday 
=> 2 
MyClass.weekday.my_module_method 
=> "Tuesday" 

是否有可能做到這一點的轉換與模塊的方法還是我想錯在這裏?

我可以通過self訪問模塊內的對象,但我似乎無法做到self.weekday

+0

你想'2.my_module_method'返回'「星期二」'? –

+0

有一個'wday'來獲得一天的整數值。就像這個例子'DateTime.parse(「Tuesdayy」)。wday#=> 3'。如果你想要一天,只需使用'yourdateObj.strftime('%A')'',不需要這些轉換。 – Pavan

+2

不清楚。發佈定義。例如,在一個模塊中,self可以是模塊本身。 –

回答

1

你試圖做的事當然是可能的。當你將ActiveRecord :: Inflector指向類似的工作時,你是正確的。這種方法修改Fixnum類本身來添加新的方法,雖然我不一般建議核心類的臨時補丁,你可以在active_support/core_ext/integer/inflections.rb看到它在行動:

require 'active_support/inflector' 

class Integer 
    # Ordinalize turns a number into an ordinal string used to denote the 
    # position in an ordered sequence such as 1st, 2nd, 3rd, 4th. 
    # 
    # 1.ordinalize  # => "1st" 
    # 2.ordinalize  # => "2nd" 
    # 1002.ordinalize # => "1002nd" 
    # 1003.ordinalize # => "1003rd" 
    # -11.ordinalize # => "-11th" 
    # -1001.ordinalize # => "-1001st" 
    # 
    def ordinalize 
    ActiveSupport::Inflector.ordinalize(self) 
    end 
end 

在你的情況下,我可能會做一些事情如:

module WeekdayInflector 
    def weekday 
    Date::DAYNAMES[self] 
    end 
end 


class Fixnum 
    include WeekdayInflector 
end 

這將至少幫助其他人通過查看模塊追蹤您添加的方法。請注意,這會影響Fixnum的所有實例,並且如果包含嘗試執行相同操作的Gem,可能會導致衝突。值得一提的是,這種折衷是否值得,或者定義一個簡單的視圖幫手是更好的選擇。