Как использовать функции Эйфеля?

Так что я только начинаю изучать Eiffel. В одном из первых упражнений в книге, которую я использую, говорится о создании функции, которая выполняет base^exp без использования ^. Я скопировал свой код ниже.

class
    APPLICATION

inherit
    ARGUMENTS

create
    make

feature {NONE} -- Initialization

    make
            -- Run application.
        do
            create power(2;3)
            printf("2 to the power of 3 is " + answer)
        end

    power(base : REAL; exp : INTEGER) : REAL
        -- computers base raised to the bower of exp without using ^
        local
            remain : INTEGER
        do
            remain := exp
            if remain = 0 then
                result := 1
            else
                from
                until
                    remain = 0
                loop
                    result := result * result
                    remain := remain -1
                end
            end
        end
end

Как мне это использовать? Нужно ли мне это на том же уровне, что и make feature{NONE}? Я знаю, как я вызываю это неправильно, и я не могу найти ничего в главе, которую я только что прочитал, или в Интернете о том, как передавать в нее параметры или как использовать ее результаты.


person languagelearner    schedule 17.07.2015    source источник


Ответы (1)


Есть несколько проблем с исходным кодом:

  1. create используется для создания объекта, но вы не собираетесь ничего создавать, а получить результат вычисления функции power, вызвав ее. Поэтому ключевое слово create не нужно.

  2. Вы используете объект answer, чтобы сообщить результат оценки на экране. Однако это нигде не декларируется. Я считаю, что подходящим местом будет раздел объявления локальной переменной.

  3. Сущность answer не инициализируется результатом функции power. Обычно это делается с помощью инструкции присваивания.

  4. Аргументы функций разделяются запятой, а не точкой с запятой.

  5. Из исходного кода неясно, какого типа переменная answer. Предполагая, что он соответствует типу функции power, перед добавлением его в строку его необходимо преобразовать в строку. Это делается путем вызова функции out.

  6. Стандартная функция для вывода строки на консоль — print, а не printf.

Объединяя критические точки выше, мы получаем

make
        -- Run application.
    local
        answer: REAL
    do
        answer := power(2, 3)
        print ("2 to the power of 3 is " + answer.out)
    end

После этого код можно компилировать. Теперь менее критичные моменты:

  1. Это хороший стиль — размещать функции в отдельных предложениях функций, поэтому я бы добавил строку вроде feature -- Basic operations перед функцией power.

  2. Реализация функции power имеет как минимум две проблемы. Я не буду подробно описывать их здесь, а вместо этого дам две подсказки:

    • по умолчанию числовое значение Result инициализируется значением 0, это необходимо учитывать для операций, которые используют его без предварительного присвоения какого-либо другого значения.

    • хотя аргумент base передается функции power, он остается неиспользованным в исходной версии кода.

person Alexander Kogtenkov    schedule 17.07.2015