Eiffel: однажды функция имеет общий или привязанный результат.Попытка создать константы - PullRequest
0 голосов
/ 17 октября 2018

Я пытаюсь создать цвета для регистрации терминала, чтобы мои ошибки были понятнее.При этом мне кажется очевидным, что мне придется создавать константы, подобные следующим.Поскольку я не хочу создавать экземпляр каждый раз, когда я вызываю свою константу, для меня имеет смысл сделать что-то подобное, но компилятор, похоже, не имеет той же концепции, что и я ...

A once function has generic or anchored result что такое anchored результат ?

Поскольку у компилятора всегда последнее слово, а у меня передний план, почему я не прав и прав ли он?

class
    TERMINAL_COLOR

create
    make

feature -- Initialization

    make (a_fg: like foreground; a_bg: like background)
        do
            foregound := a_fg
            background := a_bg
        end

feature -- Status report

    foreground: INTEGER

    background: INTEGER

feature -- Colors

    Black: like Current
        once -- compiler doesn't agree with me
            create Result.make (30, 40)
        ensure
            instance_free: class
        end

end

Ответы [ 2 ]

0 голосов
/ 17 октября 2018

Тип привязки - это когда вы используете «подобную функцию» (обратите внимание, что вы также можете использовать «like {FOO} .bar»).

Кроме того, не забывайте, что Once is "один раз в классе"(не по типу).Вот почему тип результата для функции Once не может использовать какой-либо формальный шаблон.Например,

class FOO [G]
feature
    bar: STRING
        once
           Result := generating_type
        end
end

(create {FOO [INTEGER]}).bar вернет тот же объект, что и (create {FOO [STRING]}).bar.

Итак, теперь, если bar вернет G в классе FOO, это вызовет проблемытак как нет способа вернуть значение, соответствующее любому формальному (INTEGER, STRING, ...).

Именно поэтому универсальный тип запрещен для одного типа результата.

Применяется та же логикадля привязки типа like feature_name, например feature_name можно переопределить в потомке с другими типами.

0 голосов
/ 17 октября 2018

Действительно, если функциям не разрешено возвращать значение привязанного типа или формального универсального типа.Причина заключается в семантике функции Once: ее тело выполняется только один раз (я опускаю более сложные случаи с рекурсией) независимо от текущего типа объекта.

В вашем примере это будетвозможно иметь потомка класса TERMINAL_COLOR, скажем, TOUCH_PAD_COLOR (что бы это ни значило):

class
    TOUCH_PAD_COLOR
inherit
    TERMINAL_COLOR
create
    make
feature
    touch_color: like Current
            -- Color for visual indication of user interaction.
        ...
end

Давайте посмотрим, что происходит в следующем коде:

t: TERMINAL_COLOR
p: TOUCH_PAD_COLOR
...
t := {TERMINAL_COLOR}.black
p := {TOUCH_PAD_COLOR}.black

Поскольку black возвращает like Current, оба назначения действительны: тип black равен TERMINAL_COLOR в первом вызове и TOUCH_PAD_COLOR - во втором.Однако тело функции black выполняется только один раз, а именно при первом вызове.И тип вычисляемого объекта - TERMINAL_COLOR.Во втором присваивании ранее вычисленный объект возвращается без выполнения тела функции black.Тип объекта остается прежним: TERMINAL_COLOR.Но теперь этот объект прикреплен к сущности p типа TOUCH_PAD_COLOR.Выполнение вызова p, например, p.touch_color, приведет к сбою, поскольку в классе TERMINAL_COLOR нет метода touch_color.

Что касается терминологии, то привязанные типы обозначают типы, объявленные в терминахнекоторые другие лица.Например, like Current относится к типу текущего класса.

Отказ от ответственности. Существуют различные виды одноразовых функций, в приведенном выше сценарии рассматривается наиболее распространенный случай.

...