[英]In Smalltalk, if x is an array, and x at: 3 put: 123 will work, then how can (x at: 3) + 1 work?
也就是說,如果我們將其視為所有對象和消息,那么
"Did this earlier: x := Array new: 20"
x at: 3 put: 123 "this will put 123 into slot 3"
只有當x at: 3
返回時才能像“單元格”對象一樣工作,所以單元格可以接收一個Interger對象,即123.(或者,單元對象可以讓一些myContent
屬性指向123對象)
那么在這種情況下,怎么可能
y := (x at: 3) + 567
工作? 因為單元格如何處理+
消息? 是不是以某種方式,單元格對象認為它不知道如何處理+
消息,所以它查看其內容(可能通過self myContent
類的東西)然后返回它? 它是如何工作的? 我想知道是否有一個設計模式名稱。
x at: 3 put: 123
發送at:put:
selector到x
。
選擇器有明確的優先級
1 negated
) 1 + 2
) at:put:
關鍵字選擇器的“參數”數量不相關,它將始終被解釋為單個關鍵字選擇器,因此detect:ifFound:ifNone:
將被解釋為發送到對象而不是三個單獨選擇器的單個選擇器。
現在,如果您想要更改優先級,或者將一個關鍵字選擇器放在另一個中,則必須將其括在parens中。
所以你的x at: 3 put: 123
只包含一條消息: at:put:
; 如果你真的想把put:
發送到位置3
的值,你需要把它放在parens (x at: 3) put: 123
,這也與你對(x at: 3) + 567
觀察結果一致。
來自其他語言的等效語法是x.atPositionInsert(3, 123)
和x.atPosition(3) + 567
。
沒有“細胞”對象。 x at: 3 put: 123
將Integer 123
放入Collection x
的索引3
。 x
(Collection,可能是一些更具體的類型,如Array)負責存儲對象並在提供適當的索引時檢索它,但它不會創建和存儲不同的對象。 集合的內部運作x
是從視圖的用戶的角度不透明x
-你不知道怎么 x
的存儲問題的整數-你只知道,當你發送消息at:
用爭論3
至x
你要回到之前存儲的東西 - 也就是說你會回來123
。 所以沒有“單元”對象必須解釋+
- 整數123
是處理+
消息的。
很有可能創建解釋發送給它們的任意消息的類。 在Smalltalk的版本中(例如Dolphin,Visual Smalltalk),我通過實現'特殊'消息來完成這項工作doesNotUnderstand:
.
希望這可以幫助。
我可能會在Peter的回答中補充說,括號就像其他語言中的parens一樣,它會強制首先評估parens中的表達式。 如果有多個parens,則評估從左到右。 因此,y:=(x at:3)+ 567首先評估(x at:3),得到123.第二次評估123 + 567,得到690,y設定為690。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.