在 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.
尝试保存时,确保添加 columns
和 rows
作为实例变量。现在您可以重新开始执行并在检查器窗格中检查您的游戏。
要在成绩单中显示某些内容,您可以在 playground 中输入内容
(Game newBoardColumns: 2 rows: 3) show
和 DoIt。那会再次弹出一个调试器,告诉你 #show
不被理解。您可以在游戏中将其实现为
show
Transcript cr; show: columns asString,' ', rows asString
我创建了一个游戏 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.
尝试保存时,确保添加 columns
和 rows
作为实例变量。现在您可以重新开始执行并在检查器窗格中检查您的游戏。
要在成绩单中显示某些内容,您可以在 playground 中输入内容
(Game newBoardColumns: 2 rows: 3) show
和 DoIt。那会再次弹出一个调试器,告诉你 #show
不被理解。您可以在游戏中将其实现为
show
Transcript cr; show: columns asString,' ', rows asString