0

这很简单。这是我想要对格式为 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

为什么或为什么我不这样做?非常感谢您帮助清除对我来说代表心理障碍的事情。

4

2 回答 2

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"

这个答案涵盖了您问题的红宝石哲学部分,但如果您正在进行大量日期格式设置,请考虑使用已经为您完成的 gem。

于 2012-12-03T23:29:39.100 回答
1

您问题中的代码暗示了 mixin,这是一种可能的方法。它更习惯地写成这样:

module DateHelper
  def date_to_some_format(date)
    ...
  end
end

请注意,该方法是一个实例方法,并且它的名称不会与任意类中的其他方法发生潜在冲突。如果您希望该方法在类级别可用,您可以这样做的一种方法是:

class SomeClass
  class << self
    include DateHelper
    ...
  end
end

这是处理类级别混入的一种方法;还有其他的。

是否需要 mixin 取决于上下文。日期格式是否涉及您发现在不相关的类中到处重复的代码?它是一次性的,您将永远不会再使用?需要记住状态吗?日期格式是否非常有用,可以作为核心库的扩展?这些问题的答案将表明代码是否应该在 mixin 中或以其他方式处理。(mixin 通常在 Ruby 中通过模块实现。)真正学习 ruby​​ 的一部分是在不同的上下文中了解这些问题的答案。在这方面几乎没有简单的答案,并且在一定程度上取决于惯例、个人喜好和房屋风格。

顺便说一句,获取您正在寻找的日期格式的一种方法是(遵循您的输入日期格式 YYYYMMDD):

Date.strptime("20100101", "%Y%m%d").strftime("%m/%d/%Y")

您不必在代码中以这种方式将其链接在一起——例如,Brendan Benson 的响应提供了一种很好的方法——尽管如果您只在一个地方这样做,您可能不需要花哨的东西。

于 2012-12-04T00:22:32.587 回答