Ruby 使用其他类中的实例方法

Ruby 使用其他类中的实例方法,ruby,Ruby,我创建了一个返回城市本地时间的类 class GetTime def london #some code end def newyork #some code end end time = GetTime.new time.london # => 2015-10-16 10:46:54 假设每个城市都有一家商店从9点到17点营业,我想确定这家商店是否营业。我定义了类MarketOpen。我想在GetTime的实例上调用它的方法is\u open?。如果

我创建了一个返回城市本地时间的类

class GetTime
  def london
    #some code
  end

  def newyork
    #some code
  end
end

time = GetTime.new
time.london # => 2015-10-16 10:46:54
假设每个城市都有一家商店从9点到17点营业,我想确定这家商店是否营业。我定义了类
MarketOpen
。我想在
GetTime
的实例上调用它的方法
is\u open?
。如果从
time.london
返回的时间介于9到17之间,则该方法应返回
true

class MarketOpen
  def is_open?
    #some code
  end
end

time.london.is_open?

这是可以实现的吗?这是一个好的做法吗?从另一个类调用方法的最佳方法是什么?

我不相信
GetTime
是一个有用的模型,但在本例中我将保持它不变。然后我会将
Shop
更改为如下内容:

class Shop
  attr_reader :location

  def initialize(location)
    @location = location
  end

  def open?
    # some code checking `local_time` against opening hours
  end

private

  def local_time
    time = GetTime.new
    time.send(location)
  end
end
以下内容应返回您的预期结果:

shop = Shop.new('London')
shop.open?
更新:我将使用以下方法实现本地时间计算:

使用此实现可以将我的答案中的private
local\u time
方法更改为:

def local_time
  LocalTime.for(location)
end

如果
time.london
是时间对象(或其子类),则
是否打开?
必须是时间方法(或其子类)。为什么你有
MarketOpen
?@潜伏者将地点分配给时间是有意义的。事实上,时间实例有一个称为时区的属性。“实际上,我没有考虑时区场景。”但我还是不会最终把市场的“运行时间”看成是时间/时区的一部分。“SAWA只是因为我想让每个班级只做一件事。”一个知道时间,一个知道市场开盘/收盘的信息。但同样,这可能是一个糟糕的方法…谢谢@spickermann您认为有更好的方法来定义本地时间吗?或者4CT2,您可以将
GetTime
作为一个模块及其方法模块方法(
def self.london…
)。我认为更好的方法是(对于
GetTime
module)定义一个带有键cities和值时区的常量散列,然后只使用一个模块方法,如下所示:
GetTime.for(“Toyko”)
GetTime.for(:Toyko)
@spickermann还有一个问题,dst。。。现在伦敦是+1,但不会是2weeks@0r4cl3您可能想考虑使用或另一个GEM,而不是试图自己解决DST问题。
def local_time
  LocalTime.for(location)
end