Отредактировано один раз - из-за комментария fede s.
Добро пожаловать на SO.
Отказ от ответственности : Я использую ветку Smalltalk / X-jv, которая отличается от smalltalk от gnu-smalltalk, поэтому я не эксперт по gnu-smalltalk.
1145 Я укажу вам на некоторые недостатки, которые я обнаружил. Слишком много, чтобы указывать. Я дам вам несколько общих идей.
Я обычно не рекомендую использовать a
, b
, c
... z
в качестве переменных. Если вы вернетесь к коду через некоторое время, вы его не поймете.
Для переменных используйте строчные буквы, такие как content
вместо Content
. Первая заглавная буква зарезервирована для глобальных переменных. В вашем случае использования это будет имя класса (не смешивайте его).
Если вы хотите создать новый экземпляр, используйте его следующим образом: aCard := Card new.
Не создавайте всю логику приложения в вашем методе #init
(initialize) ! Вы должны разбивать свой код небольшими читаемыми методами.
Ваш init должен выглядеть следующим образом:
Deck extend [
init [
content := Array new: 52.
Transcript show: 'Initializing Deck...'.
]
]
, который создаст метод #init
с переменной экземпляра content
. Не забудьте создать методы доступа к переменной. Прочтите руководство для gnu-smalltalk и создания методов экземпляра.
У вас должны быть комментарии к петлям whileTrue:
. Зачем кому-то угадывать причину ограничений?
[a <= 4] whileTrue:[
b := 1 .
[b <= 13] whileTrue:[
...
Иметь веские основания для переопределения new
сообщения. Сообщение Transcript
может быть ini init
:
Deck class >> new [
| r |
r := self new .
Transcript show: 'start '.
r init .
^r
]
Почему вы переопределяете новое? Если у вас есть объект, который является Object subclass:
, то он уже понимает сообщение new
.
В нижней части кода у вас есть z := Deck new.
(я рекомендую использовать, например, myDeck := Deck new.
). Если вы хотите запустить инициализацию, вы просто выполните myDeck init
.
Почему вы в Card >> init
возвращаете ^super init
? Может быть, вы хотели сделать первую строку super init
(чтение \ загрузка инициализации суперкласса), а затем вернуть ^ self
? Трудно сказать.
Suit := Club .
Что это значит? Вы создаете как-то новый объект? (отсутствует сообщение #new
). Ты пытаешься задеть ниточку? Это должно быть suit := 'Club'.
тогда. (то же самое касается всех Sunit
переменных).
Еще бы просто читать с хрустального шара. Попробуйте прочитать больше о Smalltalk, и я надеюсь, что мои советы помогут вам в дороге.
sed выводит свой ввод, потому что подстановка не совпадает. Поскольку вы, вероятно, используете GNU sed, попробуйте следующее:
echo "ko05414 ko:ITGA4" | sed 's/\(^ko[0-9]\{5\}\)\tko:\(.*$\)/\1\2/'
Это должно сработать. Вы также можете пропустить последнюю группу и просто использовать вместо нее \ 1
, но, поскольку вы изучаете sed и regex, это хороший материал. Я хотел использовать группу без захвата посередине (:?)
, но я не мог заставить ее поиграть с sed по какой-то причине, возможно, она не поддерживается.
sed --posix 's/\(^ko[0-9]\{5\}\)\( ko:\)\(.*$\)/\1 \3/g' file > result
И, конечно, вы можете использовать
sed --posix 's/ko://'
Для этого вам не нужен sed
Вот как это можно сделать с помощью bash:
var="ko05414 ko:ITGA4"
echo ${var//"ko:"}
${var//"ko:"} заменяет все "ko:" на ""
Смотрите Манипулирование строками для получения дополнительной информации
@ ОП, если вы просто хотите избавиться от «ko:», тогда
$ cat file
ko04062 ko:CXCR3
ko04062 ko:CX3CR1
ko04062 ko:CCL3
ko04062 ko:CCL5
some text with a legit ko: this ko: will be deleted if you use gsub.
ko04080 ko:GZMA
$ awk '{sub("ko:","",$2)}1' file
ko04062 CXCR3
ko04062 CX3CR1
ko04062 CCL3
ko04062 CCL5
some text with a legit ko: this ko: will be deleted if you use gsub.
ko04080 GZMA
Просто примечание. Хотя вы можете использовать чистую подстановку строк в bash, она более эффективна только тогда, когда вы изменяете одну строку. Если у вас есть файл, особенно большой, использование цикла while read в bash по-прежнему медленнее, чем использование sed или awk.