Как мне создать метод, который хранит имена в Pharo? - PullRequest
0 голосов
/ 04 июня 2018

Я пытаюсь создать метод, в котором хранятся имена, а затем (возможно, в другом методе) добавлять их друг к другу, чтобы создать массив.Меня интересует размер массива.

Чтобы объяснить лучше, скажем, у меня есть три человека в группе, а затем я хочу создать группу с фиксированным количеством людей.например, мне нужно определить «addPerson» и «группу людей» в коде ниже:

| People |
People := People new.
People 
    addPerson: Person John;
    addPerson: Person Adam;
    addPerson: Person Josh.
self assert: People peopleGroup size = 3

Я очень новичок в Smalltalk и Pharo, так что это может быть вопрос для начинающих.

1 Ответ

0 голосов
/ 04 июня 2018

Позвольте мне сначала указать на ошибку в вашем коде, чтобы мы могли сосредоточиться на вашем вопросе.

Учитывая, что вы отправляете сообщение new на People, мы можем предположить, что у вас уже естьсоздал класс People.Однако есть проблема в двух первых строках

| People |
People := People new.

, которые должны были быть написаны как

| people |
people := People new.

или

| group |
group := People new.

, иначе вы быназначить экземпляр People самому классу People, что сделало бы невозможным доступ к классу по имени.Конечно, компилятор Smalltalk предотвратит использование временного верхнего регистра, не говоря уже о том, что он сталкивается с именем класса.Тем не менее, вам должно быть ясно, что вы не хотите изменять привязку между идентификатором People и классом, который он представляет.

Последующий каскад выглядит частично нормально, если ваш класс People реализует метод addPerson:.

Последнее выражение можно упростить до

 self assert: people size = 3,

, что потребует от вас только реализации метода size в People, чтобы он отвечалс количеством «персон», которое он содержит.

Другие подозрительные сообщения: Person john и т. д. Вы должны добавить метод на стороне класса newNamed: в Person и написать вместо него:

Person newNamed: 'John'

, где

newNamed: aString
  ^self new name: aString
...