2013-07-18 24 views
9

私は最近、クラス/モジュールに別のクラス/モジュールが含まれているかどうかを検出できることを発見しました。例えばArrayはそうあなたがFoo <Rubyのバー

Array < Enumerable # true 

Stringしかし、ここで何が起こっている正確に何

String < Enumerable #nil 

可算ではありませんか?行うことができますEnumerableですかこの構文はどのようにRubyで動作しますか?

答えて

8

は、クラスの先祖チェーンを取得する方法である:

>> Array.ancestors 
=> [Array, Enumerable, Object, Kernel, BasicObject] 

クラスはそうでない祖先チェーンで別のクラスの「左」とfalseの場合<メソッドがtrueを返す:

>> Array < Object 
=> true 
>> Array < Enumerable 
=> true 

<メソッドは、クラスが "left"または祖先チェーンの別のクラスでない場合にfalseを返します。

>> Enumerable < Array 
=> false 
>> Array < Array 
=> false 

Enumerableは、Arrayクラスと混在するが、Stringクラスに混在しないモジュールです。

>> Array.ancestors 
=> [Array, Enumerable, Object, Kernel, BasicObject] 
>> String.ancestors 
=> [String, Comparable, Object, Kernel, BasicObject] 

EnumerableモデルをStringクラスに含めると、trueも返されます。

class String 
    include Enumerable 
end 

# Enumerable is now included in String 
String < Enumerable #true 

シンタックスは、構文上の理由から機能します。すべてがRubyと糖衣構文でオブジェクトをも付加のような基本的な操作で使用されている。

>> 3 + 4 
=> 7 
>> 3.+(4) 
=> 7 

次のように<方法の明示的な構文は次のとおりです。

>> Array.<(Object) 
=> true 
>> Array.send(:<, Object) 
=> true 
4

ここでは何が起こっていますか?この構文はどのようにRubyで動作しますか?モジュールは、渡された引数のサブクラスである場合

はtrueを返します:

StringArrayクラスはよう<クラスメソッドをdefinesModuleクラスから継承Classクラスから継承されます。 2つの間に関係がない場合はnilを返します。

構文2つのモジュールが先祖チェーンに表示された場合、通常<=>は、その中のそれらの位置に対して適用

Array.< Enumerable 
String.< Enumerable 
+1

[ '<=>'インスタンスメソッド] ['Class'](http://www.rubydoc.info/stdlib/core/Class)のWebサイト(http://www.rubydoc.info/stdlib/core/Module#%3C%3D%3E-instance_method)はここでは無関係です。 ['<'インスタンスメソッド](http://www.rubydoc.info/stdlib/core/Module#%3C-instance_method)には、「<=>」に依存しない独自の定義があります。これは、ソースの表示 "をクリックします。 –

+0

@ RoryO'Kane、ありがとう。編集されました。 – Shoe

3

Array < Enumerable 
String < Enumerable 

は、と見ることができます鎖。そうでない場合は、nilが返されます。ここで

関連する問題