如何找到"必要"方法来提供Ruby mixins的接口?

ulv*_*ver 9 ruby oop inheritance implementation interface

问题标题的可怕性是我想要解决的问题.例:

在Ruby中,Enumerable是一个界面,在某种意义上我可以实现一些东西并将其记录为:

def myfancymethod(please_pass_me_an_Enumerable_here)
Run Code Online (Sandbox Code Playgroud)

但另一方面,Enumerable是一种对#each作为其中一种方法的接口的放大.如果我有课

class Foo
  def each
    :bar
  end
end
Run Code Online (Sandbox Code Playgroud)

对于那些不熟悉的Ruby,如果混入可枚举模块中的一类,你会得到许多方法,只有依靠#each的方法来提供类似的东西#map,#select等等.

我可以说我的Foo班级是可枚举的或可枚举的兼容或什么?什么术语描述了"成为一个可枚举者需要什么?","你必须拥有#each"的答案

同样,在Ruby中

(Array.new.methods - Object.new.methods).size # 111
Run Code Online (Sandbox Code Playgroud)

这是否意味着伪造一个Array接口,我必须实现111个方法?没办法,但我怎么找出哪些方法是Array的"本质".它只是#[],#[]=而且#size?怎么理解它?

Ser*_*sev 5

我想到了"合同"这个词.例如,可枚举的合同是"给我#each,我会给你这些奇特的方法".


tra*_*ans 4

您可能对此功能请求感兴趣,它建议对广泛使用的类的架构进行一些改进Hash

可悲的事实是忘记它。在这一点上,Ruby 还没有这样的东西。Enumerable并且Comparable他们的“合同”只是一个文件问题。

顺便说一句,我相信#size还有另一种方法Enumerable可以使用,尽管它是可选的。