Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/three.js/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
它真的是关于smalltalk中的信息传递吗_Smalltalk - Fatal编程技术网

它真的是关于smalltalk中的信息传递吗

它真的是关于smalltalk中的信息传递吗,smalltalk,Smalltalk,我是smalltalk的新手,语言中只有6个关键字(self、super、true、false、nil和thisContext),这给我留下了深刻的印象,而且几乎所有内容都作为消息传递,例如使用whileTrue循环、使用ifTrue的if/else等,这是多么纯粹。。。这和我在其他语言中所习惯的有很大的不同 然而,在某些情况下,我无法理解消息传递的真正意义,包括: 赋值运算符:= 级联运算符 周期运算符 创建集合的方法#(…) 这些不是消息传递,对吗?正如您所发现的,仍然存在一些实际的Sm

我是smalltalk的新手,语言中只有6个关键字(self、super、true、false、nil和thisContext),这给我留下了深刻的印象,而且几乎所有内容都作为消息传递,例如使用whileTrue循环、使用ifTrue的if/else等,这是多么纯粹。。。这和我在其他语言中所习惯的有很大的不同

然而,在某些情况下,我无法理解消息传递的真正意义,包括:

  • 赋值运算符
    :=
  • 级联运算符
  • 周期运算符
  • 创建集合的方法
    #(…)

这些不是消息传递,对吗?

正如您所发现的,仍然存在一些实际的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