2013-07-18 105 views
9

我最近發現可以檢測一個類/模塊是否包含另一個類/模塊。例如ArrayEnumerable所以你可以做Foo <Ruby in Ruby

Array < Enumerable # true 

String但是是不可枚舉

String < Enumerable #nil 

究竟發生在這裏?這個語法在ruby中如何工作?

回答

8

這裏是如何得到祖先鏈的一類:

>> 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 
4

究竟發生了什麼?這個語法在ruby中如何工作?

返回true如果模塊是傳遞的參數的子類:

String的和Array類從類ClassModuledefines<所述類方法繼承繼承。如果兩者之間沒有關係,則返回nil。

的語法:

Array < Enumerable 
String < Enumerable 

可以被看作是:

Array.< Enumerable 
String.< Enumerable 
+1

的['<=>'實例方法] (''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)有自己的定義,不依賴於'<=>',正如您通過單擊「查看源文件「。 –

+0

@ RoryO'Kane,謝謝。編輯。 – Shoe

3

如果兩個模塊出現在一個祖先鏈,則普通<=>適用相對於它們的位置在該鏈。如果不是,則返回nil