早安。 我在大学开始使用Eiffel。
我有这个例子:
class
CLASS_1
create make
feature
x: INTEGER
make
do
x:=0
end
increment(inc: INTEGER)
do
x:=x+inc
end
get_x: INTEGER
do
Result:=x
end
end
----------------
class
CLASS_2
create make_2
feature
make_2
do
print("EXAMPLE")
meth_1
end
meth_1
local
instance: CLASS_1
i: INTEGER
do
create instance.make
from
i:=0
until
i<20
loop
instance.increment(5)
end
io.put_string ("The result is: ")
io.put_integer (instance.get_x)
end
end
为什么结果始终为0?似乎它没有更新价值。 我读过客户端类属性是只读的。这是真的吗?
答案 0 :(得分:1)
问题不在于变量属性,而在于循环永远不会被执行。只需删除循环,同时保持对过程increment
的调用,您就会看到差异。
谈到循环,代码有两个问题:
与其他语言中的while
循环不同,until
部分中的表达式是退出条件。只要此条件为true
,循环就会退出。在此代码中,这发生在第一次迭代(因为i = 0
和0 < 20
),即没有触及循环体。
变量i
在循环体中没有改变,并且对于所有循环迭代具有相同的初始值。
次要评论:
不需要&#34; getter&#34; Eiffel中的方法,例如get_x
。您可以直接使用x
。
自我初始化变量属性设置为对象创建时的默认值。特别是,当创建类型为x
的对象时,0
设置为CLASS_1
。在创建过程中使用x := 0
是无害的,但除非您想将此过程用作常规过程,否则也无用。