2017-02-09 15 views
1

Я создал класс Game, и у меня есть метод под названием Board, который должен принимать stdin из 2 целых чисел, а 1 целое будет назначено переменной столбца, а другое целое будет назначено переменной строки. Так, например, открытие транскрипт на Pharo и печатая это:Как я могу принять аргумент после вызова метода в расшифровке стенограммы на Pharo Smalltalk?

«Игра новый совет 2 3»

должен сделать столбец = 2 и строка = 3, но я не могу понять, как это сделать.

Вот мой код попытка

board 

| col rows | 

col := stdin nextNumber 

rows := stdin nextNumber 

Transcript cr; show: col asString, rows asString 

ЭТО НЕ РАБОТАЕТ. Я должен создать настольную игру, и я не могу даже понять, как принимать аргументы из стенограммы/рабочего пространства, и я прикручен, это должно произойти в следующее воскресенье!

ответ

3

Позвольте мне показать вам идиоматический путь. Если вы наберете в вашей детской площадке

игры newBoardColumns: 2 ряда: 3

, а затем DoIt и пойти, отладчик выскочит говорил вам, что #newBoardColumns:rows: сообщение не понят игры. В вашем отладчике у вас есть кнопка создания, которая позволяет вам добавить этот метод. Если вы выбираете, чтобы добавить его на классе стороне игры, вы можете реализовать его как-то вроде

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

Это вернет новый экземпляр класса Game, и инициализировать его с помощью метода столбцов и строк. Если вы сохраните это и перезапустите выполнение в отладчике, он будет жаловаться, что он не знает #initializeColumns:rows:, поэтому вам придется создавать его таким же образом, на этот раз на стороне экземпляра игры.

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

при попытке сохранить, не забудьте добавить columns и rows в качестве переменных экземпляра. Теперь вы можете снова перезапустить выполнение и проверить свою игру в панели инспектора.

Чтобы показать что-то в протоколе, вы можете ввести в вашу детскую площадку

(Игра newBoardColumns: 2 ряда: 3) показать

и DoIt.Это снова вызовет отладчик, сообщив вам, что #show не понят. Вы можете реализовать это в игре как

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

Стенограмма больше похожа на поток ведения журнала, а не на интерактивный терминал, но вы можете оценить его выражения (вы также можете сделать это на рабочей области/игровой площадке и многих других «текстовых полях»). Это означает, что ваш «ввод»/оцениваемый текст должен быть действительным выражением Smalltalk. Game new board 2 3 нет.

Скорее, ваш метод совет должен принимать два аргумента, как показано ниже:

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

Обратите внимание на измененный метод подписи. В отличие от вашего кода, cols и rows больше не являются временными переменными, но аргументы сообщения отправляются.

Затем вы можете оценить Game new boardWithColumns: 2 rows: 3, чтобы эти размеры были напечатаны в стенограмме.