Smalltalk 如何在Pharo中更改类的实例变量?

Smalltalk 如何在Pharo中更改类的实例变量?,smalltalk,pharo,Smalltalk,Pharo,我创建了一个名为Die(Dice的单数)的类,并设置了一个实例变量side Object subclass: #Die instanceVariableNames: 'side' classVariableNames: '' package: 'MyPackage' 默认情况下,我将侧变量初始化为6: initialize side := 6. 但是,我希望能够在创建对象后更改实例变量,如下所示: myDie := Die new. myDie side: 10

我创建了一个名为
Die
(Dice的单数)的类,并设置了一个实例变量
side

Object subclass: #Die
    instanceVariableNames: 'side'
    classVariableNames: ''
    package: 'MyPackage'
默认情况下,我将
变量初始化为6:

initialize

 side := 6. 
但是,我希望能够在创建对象后更改实例变量,如下所示:

myDie := Die new.
myDie side: 10. " it doesn't to work "
在我看来,实例变量只能由类方法更改。有没有办法像上面那样改变它

另外,我还有一个方法
roll
,它返回一个介于1和指定边之间的随机数。如果我创建了两个骰子,并且想要同时掷两个骰子,或者可能同时掷三个骰子,那么我是否应该创建一个不同的类,比如
papercup
将骰子的数量输入该类,并在papercup上实现roll方法


谢谢。

你走对了方向。当你执行

myDie side: 10.
您将消息
发送到
myDie
,这是类
Die
的实例。要“响应”此消息,类die(或其超类)应实现
侧:
方法。理想情况下,此方法如下所示:

side: aNumber

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

关于第二个问题:使用Papercup类是一个好主意,但是如果您不需要广泛的功能,那么可以通过以下代码实现确切的任务:

papercup := OrderedCollection new.
papercup
    add: die1;
    add: die2;
    add: die3.
papercup collect: #roll

这样,您将滚动所有3个模具并返回3个数字的集合(
collect:
与许多编程语言中的
map()
相同)。我提供了一个速记版本,而编写收集的完整方法是:
papercup collect:[:die | die roll]
当您指定一个完整的块(闭包)并将
roll
消息发送给每个模具时。

您的思路正确。当你执行

myDie side: 10.
您将消息
发送到
myDie
,这是类
Die
的实例。要“响应”此消息,类die(或其超类)应实现
侧:
方法。理想情况下,此方法如下所示:

side: aNumber

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

关于第二个问题:使用Papercup类是一个好主意,但是如果您不需要广泛的功能,那么可以通过以下代码实现确切的任务:

papercup := OrderedCollection new.
papercup
    add: die1;
    add: die2;
    add: die3.
papercup collect: #roll
这样,您将滚动所有3个模具并返回3个数字的集合(
collect:
与许多编程语言中的
map()
相同)。我提供了一个速记版本,而编写收集的完整方法是:
papercup collect:[:die | die roll]
当您指定一个完整的块(闭包)并向每个模具发送
roll
消息时