让我们假设我有一个对象,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