如何使用Eiffel功能?

时间:2015-07-17 17:28:24

标签: function eiffel

所以我才开始学习埃菲尔。我正在使用的书中的第一个练习之一就是创建一个基本^ 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

我该如何使用它?我是否需要与feature{NONE}的{​​{1}}相同的级别?我知道我怎么称它是错的,我在我刚刚阅读的章节中找不到任何内容,或者在线如何将参数传递给它或如何使用它的结果。

1 个答案:

答案 0 :(得分:6)

原始代码有几个问题:

  1. create用于创建一个对象,但是你不打算创建任何东西,而是通过调用它来获得函数power的计算结果。因此,不需要关键字create

  2. 您正在使用实体answer在屏幕上报告评估结果。但是它没有在任何地方声明。我相信适当的地方是局部变量声明部分。

  3. 实体answer未初始化为函数power的结果。这通常由分配指令完成。

  4. 功能参数用逗号分隔,而不是用分号分隔。

  5. 从原始代码来看,它不清楚变量answer的类型是什么。假设它匹配函数power的类型,在将其添加到字符串之前,需要将其转换为字符串。这是通过调用功能out

  6. 来完成的
  7. 将字符串打印到控制台的标准功能是print,而不是printf

  8. 结合上面的关键点,我们得到

    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,它仍然未在原始版本的代码中使用