讓我們假設我有一個對象,x
,它可以接受任何一個選擇器,s1
,s2
,...,sn
。我們進一步假設對這個對象進行操作的任何一個選擇器的結果都是一個相同類型的更新對象。然後我可以「鏈」,這些選擇器(只要它們是一元的消息)如我所願,如:鏈接關鍵字消息
x s1 s2 ... sn
這將需要的x s1
結果和應用選擇s2
,然後應用選擇s3
到那結果,等等。我想申請在一些爲了一個或多個這些選擇的各種結果:
x s8 s2
在Smalltalk中,我可以做到這一點,如果選擇是一元的消息。但是,如果我的選擇器是關鍵字消息,我不能再執行此操作。如果x
單獨接受選擇,s1:
,s2:
,...,sn:
,那麼下面不起作用:
x s1: a1 s2: a2 ... sn: an
還有就是;
操作:
x s1: a1 ; s2: a2 ; ... ; sn: an
但使用級聯 :每個階段都沿途修改原始的x
,我不想在這種情況下修改x
。
要鏈接的關鍵字的消息,我想我使用下面的語法與左括號:
(...(((x s1: a1) s2: a2) ... sn: an)
這讓我覺得我在Lisp程序,如果我有3個或更多keywrod消息。一個具體的例子可能是一個多維數組。如果foo
是一個3維數組,你希望在位置2,3,5陣列中的訪問對象,我認爲它看起來像:
(((foo at: 2) at: 3) at: 5) some_object_selectors
那是當然的一個簡單的例子,但說明案子。一個可能有其他類型的嵌入對象,或其他連續對象操作鏈,您對最終結果感興趣。
在Smalltalk中是否有語法上更有吸引力的方法?我假定沒有其他操作,也許是表弟;
運營商(比方說我們用&
爲例),這將連鎖它們,如:
x s1: a1 & s2: a2 & ... & sn: an
因爲我想申請的選擇以任何或幾乎任何期望的順序(對於可能不同的結果),選擇器表格s1:s2:s3:...
太侷限了。此外,這給已存在於其它語言,如紅寶石,設施哪裏會被等效地表示爲:
x.s1(a1).s2(a2)...sn(an)
缺乏一個特殊操作,另一種可能是通過選擇參數的對陣列,或者可能是選擇器參數對的查找表。查找表需要設置爲通過文本(它必須創建和填充),這讓我瘦朝着一個數組,因爲我可以簡單地把它寫成:
x { {s1. a1}. {s2. a2}. ... {sn. an} }
這仍然是一個有點笨重,而且我米不太確定這是比只使用所有括號更優雅。恐怕我的問題可能至少有一部分是主觀的,但我有興趣知道最佳實踐可能是什麼,以及運營商是否存在,我不知道哪些可能有所幫助,或者是否有人正在通過Smalltalk進行娛樂標準組織。
好的問題,有時也表示爲消息管道或管道 - 您不是第一個錯過此功能的人,它定期在郵件列表中進行討論。我推薦這個優秀的博客http://blog.3plus4.org/2007/08/30/message-chains/ –
@ aka.nice是的,看起來他們在8年前打敗了我。 :) – lurker