【问题标题】:How to find "essential" methods to provide an interface of Ruby mixins?如何找到提供 Ruby mixins 接口的“基本”方法?
【发布时间】:2012-05-31 13:13:43
【问题描述】:

问题标题的可怕之处正是我要解决的问题。示例:

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

def myfancymethod(please_pass_me_an_Enumerable_here)

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

class Foo
  def each
    :bar
  end
end

对于那些不熟悉 Ruby 的人,如果你在一个类中混入 Enumerable 模块,你会得到几十个方法,这些方法只依赖于#each 方法来提供诸如#map#select 之类的东西。

我可以说我的 Foo 类是 Enumerable-able 或 Enumerable-compatible 还是什么?哪些术语描述了“成为可枚举对象需要什么?”、“你必须拥有#each”的答案

同样,在 Ruby 中

(Array.new.methods - Object.new.methods).size # 111

这是否意味着要伪造一个 Array 接口,我必须实现 111 个方法?没办法,但我如何找出哪些方法是 Array 的“本质”。只是#[]#[]=#size?如何理解它?

【问题讨论】:

  • 您对这个词有疑问吗?或者关于如何找到“必要”的方法?
  • 我认为用有接口的语言来回答这个问题会容易得多。
  • @SergioTulentsev 后者会很棒。我仍然不知道什么是“基本”ActiveRecord 或 Array 方法。
  • “fake an Array interface”在鸭式语言中是什么意思?

标签: ruby oop inheritance interface implementation


【解决方案1】:

我想到了"contract"这个词。例如,Enumerable 的合同是“给我#each,我会给你这些花哨的方法”。

【讨论】:

  • 在某处有通用/现有“合同”的目录吗?我在 Ruby 世界中从未见过这样的事情。我现在可以看到,在 Java 中这种跟踪是不必要的,因为您只需发布一个使用的类,如“new Enumerable(Eachable source)”或进行继承。
  • 此外,“按合同设计”很棒,但它涉及到前置/后置条件/不变量等的整个科学。我只对“基本”接口集感兴趣。
【解决方案2】:

您可能对this feature request 感兴趣,它建议对广泛使用的Hash 类的架构进行一些改进。

可悲的事实是忘记它。在这一点上,Ruby 没有这样的东西。 EnumerableComparable 几乎是最接近的,他们的“合同”只是文件问题。

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-05-20
    • 1970-01-01
    • 2010-09-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多