这很简单。这是我想要处理格式为YYYYMMDD的日期:
month = datestring[0:2]
day = datestring[2:2]
year = datestring[4:4]
return "#{month}/#{day}/#{year}"
问题是,我从未理解过Ruby,我会这样做:
我知道我想做什么,我只是不知道要放入什么样的文件或结构。如果它是一个模块,我是否在方法名前加上模块的名称:
module DateHelper
def DateHelper.transform(datestring)
...
end
end
为什么或为什么我不这样做?非常感谢你帮助澄清了一些代表我心理障碍的东西。
答案 0 :(得分:2)
考虑使用具有组合的对象,而不是模块:
class DateString
def initialize(date)
@date_string = date
end
def format
...
end
end
现在你可以做到:
my_date_string = DateString.new("20121203")
puts my_date_string.format # => "12/03/2012"
这个答案涵盖了你问题的红宝石哲学部分,但如果你做了很多日期格式化,可以考虑使用已经为你做过的宝石。
答案 1 :(得分:1)
你问题中的代码暗示了mixin,这是一种可行的方法。它更具惯用性地写成:
module DateHelper
def date_to_some_format(date)
...
end
end
请注意,该方法是一个实例方法,并且它的名称不会与任意类中的其他方法发生冲突。如果您希望在类级别提供该方法,则可以采用以下方法:
class SomeClass
class << self
include DateHelper
...
end
end
这是处理类级混合的一种方法;还有其他人。
是否需要mixin将取决于上下文。日期格式是否涉及您在不相关的类中重复发现的代码?你永远不会再使用它是一次性的吗?记得要求的状态吗?日期格式是如此有用,它可能会成为核心库的扩展吗?这些问题的答案将表明代码是应该以mixin还是以其他方式处理。 (Mixins通常在Ruby中用模块实现。)真正学习ruby的一部分是在不同的环境中了解这些问题的答案;在这方面几乎没有简单的答案,在某种程度上,事情取决于惯例,个人偏好和家庭风格。
顺便说一句,获取您正在寻找的日期格式的一种方法是(按照您输入的日期格式YYYYMMDD):
Date.strptime("20100101", "%Y%m%d").strftime("%m/%d/%Y")
你不一定会在你的代码中以这种方式将它链接在一起 - 例如Brendan Benson的回答提供了一个很好的方法 - 尽管如果你只是在一个地方这样做,你可能不需要花哨的东西。