Похоже, не удается получить вывод в расшифровке [Smalltalk]

#oop #smalltalk

#ооп #smalltalk

Вопрос:

В настоящее время я работаю над заданием, выполняемым на smalltalk, и, хотя я только начинаю понимать язык, я немного озадачен и ищу какое-то направление.

Обычно для печати в расшифровке в Pharo я бы использовал:

 print   
    Transcript show: 'Hello my name is: ' , self theName printString; cr
  

Кажется, что если я поставлю условие в начале, например

 printNew
      (age < 50) ifTrue: [ Transcript show: 'Hello my name is: ', self theName, 'and I am old' printString ]; cr
  

Кажется, я не могу заставить метод printNew печатать в расшифровке. Заранее благодарю вас!

Комментарии:

1. Итак, какова ценность age ?

Ответ №1:

Позвольте мне отформатировать ваше выражение, чтобы лучше понять его:

 (age < 50)
  ifTrue: [
    Transcript show:
      'Hello my name is: ', self theName, 'and I am old' printString];
     cr
  

похоже

 (age < 5) ifTrue: [<something>]; cr
  

который, в свою очередь, имеет структуру

 (age < 5) msg; cr
  

потому что в Smalltalk ifTrue: [<something>] нет ничего, кроме сообщения. Теперь вы видите ошибку? Каскадный символ ; сначала msg отправляет Boolean выражение (age < 5) , а затем отправляет его cr , которое он не понимает. Просто исправьте перенос между ] и ; cr :

 (age < 50)
  ifTrue: [
    Transcript show:
      'Hello my name is: ', self theName, 'and I am old' printString;
      cr]
  

Обратите внимание также, что лучший способ написать то же самое

 (age < 50)
  ifTrue: [
    Transcript
      show: 'Hello my name is: ';
      show: self theName;
      show: ' and I am old' printString;
      cr]
  

Почему? Потому что таким образом вы не создаете две промежуточные строки путем объединения трех частей вашего текста.

Наконец, обратите внимание, что из-за правил приоритета вам не нужны круглые скобки age < 50

Кстати, если вы младше 50 , вы не старый!