如何在 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

你看,非常重视封装,所以实例变量只能被对象本身直接访问,而不能被外部的任何人访问。这就是为什么您总是必须创建访问器的原因,这是许多编程语言在不同程度上遵循的一个好习惯。

关于你的第二个问题:有一个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 消息时。