[英]Ruby - Array method confusion
我們可以像這樣在頂層調用Array方法
Array(something)
這對我來說很有意義,它是一個沒有顯式接收器的方法調用,而self,在這種情況下是主要的,插入在方法調用的前面。 但這不等於:
Kernel.Array(something)
這對我沒有意義。 由於在第一種情況下,對象main是Object類,它將Kernel模塊混入,因此具有Array方法。 但在第二種情況下,我們在內核模塊對象本身上調用Array方法,而不是主對象,它們不是不一樣嗎?
對不起,我的英語不好。
Kernel.Array就是所謂的模塊函數。 模塊函數的其他示例包括Math.sin和Math.hypot等。
模塊函數是一種既是模塊上的類方法又是私有實例方法的方法。 在頂層調用Array()時,您將其作為主對象的私有實例方法調用。 當您通過Kernel.Array()調用它時,您將其作為Kernel上的類方法調用。 它們是相同的方法。
要了解更多信息,請閱讀rubydocs中的module_function方法: http ://www.ruby-doc.org/core/classes/Module.html#M001642
令你困惑的是類和實例方法之間的區別。
類方法沒有明確的接收器,因此沒有self
訪問其他字段。 他們只是......。
通常,實例方法用於查詢或操縱給定對象的屬性,而類方法是“幫助”或“工廠”方法,它們提供與某種類相關聯或特別有用的某些功能,但不依賴於實際該類的實例(對象)。
不確定Ruby,但Java有(例如)一個完整的類, Math
只包含sin()
, max()
, exp()
等實例方法:沒有“Math”對象,這些只是體現數學算法的方法。 這不是最好的例子,因為在Ruby中,這些方法可能作為實例方法嵌入到數值類中。
你提到的情況有點令人困惑,因為 Array
的()
方法和Kernel
的Array()
方法實際上是做類似事情的不同方法。兩者都是類方法。
Array()
接受一個參數列表,並生成並返回一個包含它們的數組。
Kernel.Array()
接受一個“array-able”類型的單個參數,例如一個序列,並獲取該參數返回的值並從中構建一個數組。
UPDATE
downvote也許是合理的; 我為在我的專業領域之外接受一個主題而道歉。 我想我很快就會刪除這個答案。
@Chuck:我真誠地希望語言/圖書館的官方文檔能夠提供一些有用的線索。 這是我在回答這個問題時所咨詢的。
Kernel.Array()
:
將arg作為數組返回。 首先嘗試調用arg.to_ary,然后調用arg.to_a。 如果兩者都失敗,則創建一個包含arg的單個元素數組(除非arg為nil)。
for Array.()
:
返回使用給定對象填充的新數組。
我不了解你,但我認為如果文檔變化那么多,那么他們要么談論單獨的方法,要么文檔是火車殘骸。
@ freeknight:
但是ruby中的所有東西都是某種對象,甚至是類和模塊。 而Kernel.Array實際上是對特定對象(Kernel對象)的方法調用。
是的,在Java下它也類似於Java。 但是Array()
方法沒有對Kernel做任何事情,除了Array()
正在使用Array
類對象做任何事情,所以這實際上只是一個語義狡辯。 這是一個實例方法,因為如果你足夠瘋狂,你可以把它掛在類IPSocket
,它仍然會以同樣的方式工作。
class Object mixed-in module Kernel,但Kernel是Object的一個實例。 所以內核“模塊”方法 - 是它的實例方法。
他們是一樣的東西:
a = Kernel.Array('aa')
=> [“aa”]
一類
=>數組
a =數組('aaa')
=> [“aaa”]
一類
=>數組
也許有別名?
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.