对象的 Smalltalk 副本并处理变量
Smalltalk copy of object and work on a variables
你好,我需要用 Smalltalk 做一个小程序,但我不确定我做错了什么。
所以,我有一个抽象的 class Class1,它有几个子 class 例如 Class2.
我想做的是在方法 Class1 class 中创建对象作为它们自身的副本,对其进行处理并在 return 之后进行。我知道这听起来可能很奇怪但是我解释的很烂
我的方法是这样的:
(值是来自 Class1 的变量)
|temp|
temp:= self DeepCopy.
1 to: temp >> arrayName size do:
[i: | tenp >> arrayName at i: put (temp >> arrayName at: i) + 10].
^temp
这是我在 Smalltalk 中的第一个程序,当然它不能运行,也许你知道这门语言,你可以帮助我一点。
谢谢
////////////////////////////////////////// ////////////////////// 编辑
我的方法
move: vector
| temp |
temp :=self deepCopy.
1 to: temp points size do:
[:i | temp points at: i put: ( temp points at: i) + vector].
^temp .
和用法
geo_1:=(Triangle new) initialize 10.
geo_2:= geo_1 move: 2@2
如果我没理解错的话,你想要的是克隆一个对象,修改克隆,然后 return 修改后的副本。我对吗?如果是这样,让我为您提供一些指导:
您确实可以使用 deepCopy
实现克隆机制。但是请注意,在 Smalltalk 中大小写很重要,所以请不要发送 DeepCopy
消息,因为(很可能)它不存在,请改用 deepCopy
:
temp := self deepCopy.
名称对于可读性至关重要。因此,避免使用 temp
等泛型变量。在这种情况下,我建议将临时文件重命名为 clone
,这样可以更好地反映您的意图:
| clone |
clone := self deepCopy.
明白我的意思了吗?左边的名字clone
告诉reader你在做什么。表达式 self deepCopy
告诉 你是怎么做的。
在 Smalltalk 中,您可以通过向对象发送消息来访问对象 属性。没有点符号或 >>
或任何东西。要发送消息,只需在中间留下 space:
clone arrayName
正如我的一个好朋友所说,在 Smalltalk 中,发送运算符是白色的 space.
尽量不要写关键字邮件。改用临时对象并给它们起显眼的名字:
value := clone arrayName at: i.
clone arrayName at i: put: value + 10
请注意,我使用的名称 value
不是一个好名称,因为它太笼统了。如果您的数组包含价格,您应该改用 price
。如果你的数组包含点,使用point
,等等
关于上面的第 3 项,从外部访问对象 属性 的唯一方法是向对象发送消息。在您的情况下,您想读取对象的 points
,因此您需要提供一个 #points
方法来回答对象以某种方式具有的点集合。例如,如果您的 class 有一个 points
实例变量,请定义一个名称为
的方法
points
^points
(在上面的项目中,我使用了 arrayName
,因为这是您最初在问题中使用的选择器。)
你好,我需要用 Smalltalk 做一个小程序,但我不确定我做错了什么。 所以,我有一个抽象的 class Class1,它有几个子 class 例如 Class2.
我想做的是在方法 Class1 class 中创建对象作为它们自身的副本,对其进行处理并在 return 之后进行。我知道这听起来可能很奇怪但是我解释的很烂
我的方法是这样的: (值是来自 Class1 的变量)
|temp|
temp:= self DeepCopy.
1 to: temp >> arrayName size do:
[i: | tenp >> arrayName at i: put (temp >> arrayName at: i) + 10].
^temp
这是我在 Smalltalk 中的第一个程序,当然它不能运行,也许你知道这门语言,你可以帮助我一点。
谢谢
////////////////////////////////////////// ////////////////////// 编辑
我的方法
move: vector
| temp |
temp :=self deepCopy.
1 to: temp points size do:
[:i | temp points at: i put: ( temp points at: i) + vector].
^temp .
和用法
geo_1:=(Triangle new) initialize 10.
geo_2:= geo_1 move: 2@2
如果我没理解错的话,你想要的是克隆一个对象,修改克隆,然后 return 修改后的副本。我对吗?如果是这样,让我为您提供一些指导:
您确实可以使用
deepCopy
实现克隆机制。但是请注意,在 Smalltalk 中大小写很重要,所以请不要发送DeepCopy
消息,因为(很可能)它不存在,请改用deepCopy
:temp := self deepCopy.
名称对于可读性至关重要。因此,避免使用
temp
等泛型变量。在这种情况下,我建议将临时文件重命名为clone
,这样可以更好地反映您的意图:| clone | clone := self deepCopy.
明白我的意思了吗?左边的名字
clone
告诉reader你在做什么。表达式self deepCopy
告诉 你是怎么做的。在 Smalltalk 中,您可以通过向对象发送消息来访问对象 属性。没有点符号或
>>
或任何东西。要发送消息,只需在中间留下 space:clone arrayName
正如我的一个好朋友所说,在 Smalltalk 中,发送运算符是白色的 space.
尽量不要写关键字邮件。改用临时对象并给它们起显眼的名字:
value := clone arrayName at: i. clone arrayName at i: put: value + 10
请注意,我使用的名称
value
不是一个好名称,因为它太笼统了。如果您的数组包含价格,您应该改用price
。如果你的数组包含点,使用point
,等等关于上面的第 3 项,从外部访问对象 属性 的唯一方法是向对象发送消息。在您的情况下,您想读取对象的
的方法points
,因此您需要提供一个#points
方法来回答对象以某种方式具有的点集合。例如,如果您的 class 有一个points
实例变量,请定义一个名称为points ^points
(在上面的项目中,我使用了
arrayName
,因为这是您最初在问题中使用的选择器。)