Smalltalk - вставка символа TAB (Visual Works) - PullRequest
2 голосов
/ 29 октября 2009

У меня проблемы с вставкой табуляции между двумя строками.

stringOne := 'Name'.
stringTwo := 'Address'.

Я пробовал:

info := stringOne, String tab, stringTwo.

или

info := stringOne, Character tab asString, stringTwo.

Но ни одно из этих двух сообщений не понято. Я использую Visual Works.

Ответы [ 4 ]

3 голосов
/ 30 октября 2009

Гуг дал вам способ создать строку, включающую вкладку

String with: Tab

и вы сами обнаружили, что Tab не понят в VisualWorks и должен быть заменен на

Character tab

, так что сложите эти две вещи вместе в оценке рабочего пространства, чтобы проверить, дает ли строка, содержащую символ табуляции

String with: Character tab

затем используйте это в своей конкатенации

info := stringOne, (String with: Character tab), stringTwo.

(Если вы собираетесь многократно объединять, используйте WriteStream, а не ,)

2 голосов
/ 18 ноября 2009

Самое короткое для использования расширение макроса:

info := '<1s><T><2s>' expandMacrosWith: one with: two
2 голосов
/ 29 октября 2009

У меня нет возможности проверить Visual Works, но в IBM Smalltalk Tab (обратите внимание на случай) есть символ табуляции.
Может быть, попробуйте это:

info := stringOne, Tab asString, stringTwo.

edit (re: your comment):

Хорошо, либо Tab не является правильным именем для символа табуляции, либо ваш класс символов не отвечает на asString
Попробуйте посмотреть, что дает Tab class, если он отвечает «Символ», тогда вам просто нужно узнать, как преобразовать Символ в строку в VisualWorks. Если он не отвечает «Символ», то мы не нашли правильного имени для символов табуляции в VisualWorks.


edit2:

Я не знаю, как быстро превратить символ в строку в Visual Works, поэтому вот решение, которое должно работать в любом случае. Это все, что asString сделает в любом случае:
Поскольку вы, вероятно, захотите использовать его несколько раз, вы можете сохранить его как строку,

tabString := String with: Tab.
info := stringOne, tabString, stringTwo
0 голосов
/ 11 июля 2012

Решение на основе WriteStream (оно немного более многословно, но хорошо масштабируется, и вы можете использовать его в циклах, как, например, do: separaBy)

ws := (String new:50) writeStream.
ws
    nextPutAll: stringOne;
    tab;
    nextPutAll: stringTwo.
info := ws contents.

Или, если вам действительно нравится один код лайнера:

info := (String new writeStream) nextPutAll: stringOne; tab; nextPutAll: stringTwo; contents.
...