模块内的访问对象属性

我有一个属性.weekday保存为整数值的类。

我正在尝试在模块中创建一个方法,将该数值转换为相应的工作日。

这就是我喜欢的工作方式:

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

是否可以使用模块方法进行此转换,或者我在这里想错了?

我可以通过self从模块mehtod中访问该对象,但我似乎无法做self.weekday

你想要做的当然是可能的。 当您将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,则可能会导致冲突。 值得一提的是,这种权衡是否值得,或者如果定义一个简单的视图助手是更好的方法。