簡體   English   中英

在Smalltalk中,如果x是一個數組,並且x at:3 put:123將起作用,那么(x at:3)+ 1如何工作?

[英]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. 一元( 1 negated
  2. 二進制( 1 + 2
  3. keyword( 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:用爭論3x你要回到之前存儲的東西 - 也就是說你會回來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.

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