0

我有一个Module命名,它为实现和方法Coordinated的任何模型提供与距离相关的方法。latitudelongitude

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

我想测试Coordinated包含在其中的类在加载类时实现所需的方法。我怎么做?

4

1 回答 1

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

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

于 2012-08-25T15:09:53.987 回答