如何在 Pharo 中更改 class 的实例变量?
How to change the instance variable of a class in Pharo?
我创建了一个名为 Die
(Dice 的单数)的 class 并设置了一个实例变量 side
。
Object subclass: #Die
instanceVariableNames: 'side'
classVariableNames: ''
package: 'MyPackage'
我默认将side
变量初始化为6:
initialize
side := 6.
但是我希望能够在创建对象后更改实例变量,如下所示:
myDie := Die new.
myDie side: 10. " it doesn't to work "
在我看来,实例变量只能通过class方法来改变。有没有办法像上面那样改变它?
此外,我有一个方法 roll
returns 一个介于 1 和指定边之间的随机数。如果我创建两个骰子并想同时掷两个骰子,或者同时掷三个骰子,我是否应该创建一个不同的 class,比如 papercup
用骰子的数量喂养它并改为在纸杯上实施滚动方法?
谢谢。
你走在正确的轨道上。当你执行
myDie side: 10.
您向 myDie
发送了一条消息 side:
,它是 class Die
的一个实例。要“响应”此消息,class die(或其超classes)应实现 side:
方法。理想情况下,此方法将如下所示:
side: aNumber
side := aNumber
你看,pharo非常重视封装,所以实例变量只能被对象本身直接访问,而不能被外部的任何人访问。这就是为什么您总是必须创建访问器的原因,这是许多编程语言在不同程度上遵循的一个好习惯。
关于你的第二个问题:有一个Papercup是个好主意class,但如果你不需要扩展功能,确切的任务可以通过以下代码实现:
papercup := OrderedCollection new.
papercup
add: die1;
add: die2;
add: die3.
papercup collect: #roll
这样您将掷出所有 3 个骰子和 return 3 个数字的集合(collect:
与许多编程语言中的 map()
相同)。我提供了一个 shorthand 版本,而编写收集的完整方法是: papercup collect: [ :die | die roll]
当您指定一个完整的块(关闭)并向每个骰子发送 roll
消息时。
我创建了一个名为 Die
(Dice 的单数)的 class 并设置了一个实例变量 side
。
Object subclass: #Die
instanceVariableNames: 'side'
classVariableNames: ''
package: 'MyPackage'
我默认将side
变量初始化为6:
initialize
side := 6.
但是我希望能够在创建对象后更改实例变量,如下所示:
myDie := Die new.
myDie side: 10. " it doesn't to work "
在我看来,实例变量只能通过class方法来改变。有没有办法像上面那样改变它?
此外,我有一个方法 roll
returns 一个介于 1 和指定边之间的随机数。如果我创建两个骰子并想同时掷两个骰子,或者同时掷三个骰子,我是否应该创建一个不同的 class,比如 papercup
用骰子的数量喂养它并改为在纸杯上实施滚动方法?
谢谢。
你走在正确的轨道上。当你执行
myDie side: 10.
您向 myDie
发送了一条消息 side:
,它是 class Die
的一个实例。要“响应”此消息,class die(或其超classes)应实现 side:
方法。理想情况下,此方法将如下所示:
side: aNumber
side := aNumber
你看,pharo非常重视封装,所以实例变量只能被对象本身直接访问,而不能被外部的任何人访问。这就是为什么您总是必须创建访问器的原因,这是许多编程语言在不同程度上遵循的一个好习惯。
关于你的第二个问题:有一个Papercup是个好主意class,但如果你不需要扩展功能,确切的任务可以通过以下代码实现:
papercup := OrderedCollection new.
papercup
add: die1;
add: die2;
add: die3.
papercup collect: #roll
这样您将掷出所有 3 个骰子和 return 3 个数字的集合(collect:
与许多编程语言中的 map()
相同)。我提供了一个 shorthand 版本,而编写收集的完整方法是: papercup collect: [ :die | die roll]
当您指定一个完整的块(关闭)并向每个骰子发送 roll
消息时。