私は最近、クラス/モジュールに別のクラス/モジュールが含まれているかどうかを検出できることを発見しました。例えばArray
はそうあなたがFoo <Rubyのバー
Array < Enumerable # true
String
しかし、ここで何が起こっている正確に何
String < Enumerable #nil
可算ではありませんか?行うことができますEnumerable
ですかこの構文はどのようにRubyで動作しますか?
私は最近、クラス/モジュールに別のクラス/モジュールが含まれているかどうかを検出できることを発見しました。例えばArray
はそうあなたがFoo <Rubyのバー
Array < Enumerable # true
String
しかし、ここで何が起こっている正確に何
String < Enumerable #nil
可算ではありませんか?行うことができますEnumerable
ですかこの構文はどのようにRubyで動作しますか?
は、クラスの先祖チェーンを取得する方法である:
>> 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
ここでは何が起こっていますか?この構文はどのようにRubyで動作しますか?モジュールは、渡された引数のサブクラスである場合
はtrueを返します:
String
とArray
クラスはよう<
クラスメソッドをdefinesModule
クラスから継承Class
クラスから継承されます。 2つの間に関係がない場合はnilを返します。
構文2つのモジュールが先祖チェーンに表示された場合、通常<=>
は、その中のそれらの位置に対して適用
Array.< Enumerable
String.< Enumerable
:
Array < Enumerable
String < Enumerable
は、と見ることができます鎖。そうでない場合は、nil
が返されます。ここで
[ '<=>'インスタンスメソッド] ['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)には、「<=>」に依存しない独自の定義があります。これは、ソースの表示 "をクリックします。 –
@ RoryO'Kane、ありがとう。編集されました。 – Shoe