在 Pharo Smalltalk 上调用脚本中的方法后如何接受参数?

How can i accept argument after invoking a method in transcript on Pharo Smalltalk?

我创建了一个游戏 class,我有一个名为 Board 的方法,它必须接受 2 个整数的标准输入,并且 1 个整数将分配给列变量,另一个整数将分配给行变量。例如,在 pharo 上打开 Transcript 并输入:

'Game new board 2 3'

应该使 column=2 和 row=3,但我不知道该怎么做。

这是我的代码尝试

 board

| col rows |

col := stdin nextNumber

rows := stdin nextNumber

Transcript cr; show: col asString, rows asString

这行不通。我必须创建一个棋盘游戏,我什至不知道如何接受来自 transcript/workspace 的参数,我搞砸了它下周一到期!!

Transcript 更像是日志流,而不是交互式终端,但您可以在其中计算 Smalltalk 表达式(您也可以在 Workspace/Playground 和许多其他 "text boxes" 中执行此操作)。这意味着您的 "input"/evaluated 文本必须是有效的 Smalltalk 表达式。 Game new board 2 3 不是。

相反,您的 board 方法应该有两个参数,如下所示:

boardWithColumns: cols rows: rows
    Transcript cr; show: cols asString, rows asString

注意更改后的方法签名。与您的代码不同,cols 和 rows 不再是临时变量,而是消息发送的参数。

然后您可以评估 Game new boardWithColumns: 2 rows: 3 以将这些尺寸打印到成绩单中。

让我告诉你惯用的方法。如果你在你的游乐场输入

Game newBoardColumns: 2 rows: 3

然后 DoIt 开始,调试器会弹出告诉你 #newBoardColumns:rows: 消息不被游戏理解。在您的调试器中,您有一个创建按钮,允许您添加该方法。如果您 select 将其添加到游戏的 class 端,您可以将其实现为

newBoardColumns: aColumns rows: aRows
    ^self basicNew
    initializeColumns: aColumns rows: aRows;
    yourself

这将 return 游戏的新实例 class,并使用列和行方法对其进行初始化。如果你保存它并在调试器中重新开始执行,它会抱怨它不知道 #initializeColumns:rows: 所以你必须以同样的方式创建它,这次是在游戏的实例端。

initializeColumns: aColumns rows: aRows
    columns := aColumns.
    rows := aRows. 
    self initialize.

尝试保存时,确保添加 columnsrows 作为实例变量。现在您可以重新开始执行并在检查器窗格中检查您的游戏。

要在成绩单中显示某些内容,您可以在 playground 中输入内容

(Game newBoardColumns: 2 rows: 3) show

和 DoIt。那会再次弹出一个调试器,告诉你 #show 不被理解。您可以在游戏中将其实现为

show
    Transcript cr; show: columns asString,' ', rows asString