它真的是关于smalltalk中的信息传递吗
我是smalltalk的新手,语言中只有6个关键字(self、super、true、false、nil和thisContext),这给我留下了深刻的印象,而且几乎所有内容都作为消息传递,例如使用whileTrue循环、使用ifTrue的if/else等,这是多么纯粹。。。这和我在其他语言中所习惯的有很大的不同 然而,在某些情况下,我无法理解消息传递的真正意义,包括:它真的是关于smalltalk中的信息传递吗,smalltalk,Smalltalk,我是smalltalk的新手,语言中只有6个关键字(self、super、true、false、nil和thisContext),这给我留下了深刻的印象,而且几乎所有内容都作为消息传递,例如使用whileTrue循环、使用ifTrue的if/else等,这是多么纯粹。。。这和我在其他语言中所习惯的有很大的不同 然而,在某些情况下,我无法理解消息传递的真正意义,包括: 赋值运算符:= 级联运算符 周期运算符 创建集合的方法#(…) 这些不是消息传递,对吗?正如您所发现的,仍然存在一些实际的Sm
- 赋值运算符
:=
- 级联运算符
代码>
- 周期运算符
- 创建集合的方法
#(…)
这些不是消息传递,对吗?正如您所发现的,仍然存在一些实际的Smalltalk语法。块构造、文字字符串/符号/注释、局部变量声明(
|…
)和返回(^
)都是您没有提到的一些语法方面的内容
某些扩展(例如,
#(…)
,通常创建一个数组,而不是一个集合)当然可以用其他方式表达,例如#(1 2 3)
相当于数组with:1 with:2 with:3
;它们只是为了使代码更易于阅读和编写。有一件事可能有助于澄清:self
,super
,true
,false
,nil
,thisContext
是数据原语,而不是关键字
它们是仅有的6个数据原语。这6个变量也称为伪变量。当然,其他任何事物都是类对象或其子类的实例
Smalltalk中几乎没有预定义的关键字。它们可以用非常简洁的形式写成
一个著名的例子是
exampleWithNumber:x
|y|
true&false not&(nil isNil)ifFalse:[自停止]。
y:=自身尺寸+超尺寸。
#($a#a“a”11.0)
do:[:每个|
成绩单显示:(每个班级名称);
显示:“”。
^x
下面是此方法的注释-它比方法本身更大:
说明Smalltalk方法语法每个部分的方法
除了原语。它有一元、二进制和键盘消息,
声明参数和临时变量,访问全局变量
(但不是实例变量),使用文字(数组、字符、,
符号、字符串、整数、浮点),使用伪变量
true、false、nil、self和super,并具有序列、赋值、,
返回和级联。它有零参数块和一参数块。“
+1但是这些通常是如何使用的?对我来说,“消息传递”是关于对象如何相互作用的。如果你谈论的是对象内部的细节,对我来说这是不相关的,这一点是没有意义的:注意,即使在像Java这样完全“非纯OO语言”中,你也可以做得比普通Java开发人员更好的“消息传递”(例如到处都有getter和setter,没有意识到getter和setter是OO的反命题),其中一些并不是真正的信息传递。但是后来我想,:=
看起来像一个,例如,x:=1+2
可能只是意味着将冒号等同于消息发送到x
,这样它就采用了1+2
的值,但是,优先级规则不适合。@SyntaxT3rr0r“getter和setter是OO的反命题”,当然,情况正好相反?在对象自己的类中定义的简单实例访问器是OO的基础。它们是封装的基石,封装允许松散耦合的对象。如果getter和setter被视为Java代码中OO的对立面,那么许多Java程序员必须将复杂且紧密耦合的行为合并到基本的getter和setter访问器方法中。或者我遗漏了什么?请注意,返回^
和赋值:=
也可以使用消息发送来表达:此上下文返回:anObject
和anObject instVarName:'foo'put:anObject
(例如变量、临时变量和全局变量的工作方式类似).我们几乎可以说,^
和:=
是语法上的糖;)
exampleWithNumber: x
| y |
true & false not & (nil isNil) ifFalse: [self halt].
y := self size + super size.
#($a #a "a" 1 1.0)
do: [ :each |
Transcript show: (each class name);
show: ' '].
^x < y