我最近發現可以檢測一個類/模塊是否包含另一個類/模塊。例如Array
是Enumerable
所以你可以做Foo <Ruby in Ruby
Array < Enumerable # true
String
但是是不可枚舉
String < Enumerable #nil
究竟發生在這裏?這個語法在ruby中如何工作?
我最近發現可以檢測一個類/模塊是否包含另一個類/模塊。例如Array
是Enumerable
所以你可以做Foo <Ruby in Ruby
Array < Enumerable # true
String
但是是不可枚舉
String < Enumerable #nil
究竟發生在這裏?這個語法在ruby中如何工作?
這裏是如何得到祖先鏈的一類:
>> Array < Object
=> true
>> Array < Enumerable
=> true
:
>> Array.ancestors
=> [Array, Enumerable, Object, Kernel, BasicObject]
如果一個類的祖先鏈否則爲false另一個類的「左」的<方法返回true
如果一個類不是「左」或祖先鏈中的其他類,<方法返回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
類從類Class
從Module
類defines<
所述類方法繼承繼承。如果兩者之間沒有關係,則返回nil。
的語法:
Array < Enumerable
String < Enumerable
可以被看作是:
Array.< Enumerable
String.< Enumerable
如果兩個模塊出現在一個祖先鏈,則普通<=>
適用相對於它們的位置在該鏈。如果不是,則返回nil
。
的['<=>'實例方法] (''Class'](http://www.rubydoc.info/stdlib/core/Class)的(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