Не удалось создать экземпляр объекта - PullRequest
0 голосов
/ 01 мая 2019

Я только начинаю использовать gnu-smalltalk.Я взял следующий код из здесь , чтобы определить класс:

Number subclass: Complex [
       | realpart imagpart |
       "This is a quick way to define class-side methods."
       Complex class >> new [
           <category: 'instance creation'>
           ^self error: 'use real:imaginary:'
       ]
       Complex class >> new: ignore [
           <category: 'instance creation'>
           ^self new
       ]
       Complex class >> real: r imaginary: i [
           <category: 'instance creation'>
           ^(super new) setReal: r setImag: i
       ]
       setReal: r setImag: i [ "What is this method with 2 names?"
           <category: 'basic'>
           realpart := r.
           imagpart := i.
           ^self
       ]
   ]

Однако я не могу создать ни одного экземпляра этого класса.Я пробовал различные методы и следование дает наименьшую ошибку!

cn := Complex new: real:15 imaginary:25
cn printNl

Ошибка:

complexNumber.st:24: expected object

В основном ошибка следующая, например, если после ключевого слова new нет двоеточия:

$ gst complexNumber.st
Object: Complex error: use real:imaginary:
Error(Exception)>>signal (ExcHandling.st:254)
Error(Exception)>>signal: (ExcHandling.st:264)
Complex class(Object)>>error: (SysExcept.st:1456)
Complex class>>new (complexNumber.st:7)
UndefinedObject>>executeStatements (complexNumber.st:25)
nil

Кроме того, мне не ясно, что это за метод с двумя именами, каждое с одним аргументом:

setReal: r setImag: i [  "How can there be 2 names and arguments for one method/function?"
    <category: 'basic'>
    realpart := r.
    imagpart := i.
    ^self
]

Я считаю, что обычный метод должен быть с одним именем и аргументом (ами), как в коде здесь:

   spend: amount [
       <category: 'moving money'>
       balance := balance - amount
   ]

1 Ответ

0 голосов
/ 01 мая 2019

Для создания Complex числа 25 + 25i оценки

Complex real: 25 imaginary: 25

Как узнать?Поскольку первая часть вашего вопроса гласит:

Complex class >> real: r imaginary: i [
       <category: 'instance creation'>
       ^(super new) setReal: r setImag: i
   ]

Ваша ошибка заключалась в написании Complex new: real: 25 imaginary: 25, что не соответствует синтаксису Smalltalk.

Синтаксис Smalltalk для сообщения с:скажем, 2 (или более) аргумента состоят из 2 (или более) ключевых слов, заканчивающихся двоеточием, за которым следует каждое из них, за соответствующим аргументом.

Например, метод setReal: r setImag: i имеет два ключевых слова:а именно setReal: и setImag: и получает два аргумента r и i. имя метода, которое в Smalltalk называется его селектор , является Symbol, который получается в результате объединения ключевых слов, в данном случае setReal:setImag:.

...