9

質問のタイトルの恐ろしさは、私が解決しようとしているものです。例:

Ruby では、Enumerable は、何かを実装して次のように文書化できるという意味でのインターフェイスです。

def myfancymethod(please_pass_me_an_Enumerable_here)

しかし一方で、Enumerable は、メソッドの 1 つとして #each を持つインターフェイスの一種の増幅です。クラスがあれば

class Foo
  def each
    :bar
  end
end

Ruby に不慣れな方のために説明すると、Enumerable モジュールをクラスに混在させると、メソッドのみに依存して、など#eachを提供する多数のメソッドが得られます。#map#select

私のFooクラスは列挙可能または列挙可能と互換性があると言えますか? 「Enumerable になるには何が必要ですか?」、「#each が必要です」に対する答えを説明する用語は何ですか?

同様にRubyでも

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

配列インターフェイスを偽造するには、111 個のメソッドを実装する必要があるということですか? あり得ませんが、どのメソッドが Array の「本質」であるかを調べる方法を教えてください。それ#[]はただですか?それを理解する方法は?#[]=#size

4

2 に答える 2

5

「契約」という言葉を思い浮かべます。たとえば、Enumerable のコントラクトは、「Give me #eachand I'll give you these粋なメソッド」です。

于 2012-05-24T22:39:52.593 に答える
4

広く使用されているクラスのアーキテクチャに対するいくつかの改善を提案するこの機能リクエストに興味があるかもしれません。Hash

悲しい真実は忘れてしまうことです。現時点では、Ruby にはこのようなものはありません。EnumerableそしてComparable彼らの「契約」は文書化の問題にすぎません。

ちなみに、オプションですが、利用できる#size他の方法があると思います。Enumerable

于 2012-05-28T01:16:46.863 に答える