我有一个名为Module
的{{1}},它为实现Coordinated
和latitude
方法的任何模型提供与距离相关的方法。
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
的类在加载类时实现所需的方法。我该怎么做?
答案 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
这样做的缺点是在定义方法之后必须发生,因为它们必须在钩子运行时已经存在。