Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/12.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
Arrays Pharo3中文本数组和动态数组之间的差异_Arrays_Dynamic_Smalltalk_Literals_Pharo - Fatal编程技术网

Arrays Pharo3中文本数组和动态数组之间的差异

Arrays Pharo3中文本数组和动态数组之间的差异,arrays,dynamic,smalltalk,literals,pharo,Arrays,Dynamic,Smalltalk,Literals,Pharo,阅读Pharo的文档(通过示例了解Pharo),第一个区别在于数组的制作方式 文本将遵循此语法 myArray := #(1 2 3) 而动态数组 myArray := {1+2 . 4-2 . 3 } 文字数组将直接获取值,包含数字、字符串和布尔值。而动态数组将获取完整消息,这些消息将编译并将其返回值插入数组 这两者之间还有什么区别吗?如果动态数组可以做文字数组所做的事情,那么文字数组为什么会存在 文字数组是标准的Smalltalk语法,动态数组是Squeak(因此是Pharo)扩展。我相

阅读Pharo的文档(通过示例了解Pharo),第一个区别在于数组的制作方式

文本将遵循此语法

myArray := #(1 2 3)
而动态数组

myArray := {1+2 . 4-2 . 3 }
文字数组将直接获取值,包含数字、字符串和布尔值。而动态数组将获取完整消息,这些消息将编译并将其返回值插入数组


这两者之间还有什么区别吗?如果动态数组可以做文字数组所做的事情,那么文字数组为什么会存在

文字数组是标准的Smalltalk语法,动态数组是Squeak(因此是Pharo)扩展。我相信类似的语法也存在于其他Smalltalks中,但它不是通用的


文字数组之所以存在,是因为它们总是存在——它们是Smalltalk 80的一部分。除了语法,当它们被评估时,我不认为有任何其他的区别-我相信它们都会导致一个相同类型的对象,只是它们的初始化方式不同。

动态数组,比如
{1+2.4-2.3}
基本上是一种语法糖:

Array
  with: 1 + 2;
  with: 4 - 2;
  with: 3
这是有道理的,因为数组是经常创建的。此外,您还可以将其合并以创建字典,例如:

{
  #keyOne   -> 5 .
  #keyTwo   -> 3 .
  #keyThree -> 1
} asDictionary

字面数组实际上是字面数组,并且是在编译时之前定义的。

谢谢uko,你能定义“编译时之前”吗?我在PBE中也看到过,但我不确定我到底理解它是什么means@Kilon当您“保存一个方法”或正式地“接受更改”时,它将被编译成一个字节码。这样做是出于性能原因,因为VM解释字节码命令比AST本身或其他任何东西更快。现在,当您使用:
2
@c
#sym
#(1 2 3)
和其他文本时,编译器知道这些内容不会改变,因此可以优化字节码。然而“动态数组”是在运行时(当字节码由VM执行时)组成的,因此您无法对itI做任何特殊的事情,所以它涉及优化和性能。谢谢,现在清楚了。@Kilon是的。问题是动态数组不是一个文本。它是与赋值、消息发送和级联在同一级别上的另一个表达式。