簡體   English   中英

Ruby - 數組方法混淆

[英]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()方法和KernelArray()方法實際上是做類似事情的不同方法。 兩者都是類方法。

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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM