如何要求包含模型的类实现某些方法?

时间:2012-08-25 14:48:44

标签: ruby

我有一个名为Module的{​​{1}},它为实现Coordinatedlatitude方法的任何模型提供与距离相关的方法。

longitude

我想测试包含module Coordinated ... def crow_flies_to(place) raise ArgumentError, "place does not implement latitude and longitude" unless is_coordinated?(place) Math.sqrt((latitude - place.latitude).abs**2 + (longitude - place.longitude).abs**2) end def is_coordinated?(place) place.respond_to?(:latitude) && place.respond_to?(:longitude) end ... end 的类在加载类时实现所需的方法。我该怎么做?

1 个答案:

答案 0 :(得分:1)

您可以使用包含模块时运行的included挂钩:

module M
  def self.included(klass)
    raise "Must implement 'foo'" unless klass.instance_methods.include?(:foo)
  end
end

class C; include M; end
#=> RuntimeError

class C
  def foo; end
  include M
end
#=> C

这样做的缺点是在定义方法之后必须发生,因为它们必须在钩子运行时已经存在。