我对if
声明有疑问。
我有一个带命令行参数和utf8(€ - 符号)的程序。
错误位于works_not
声明中的if
。
class EURO
insert ARGUMENTS
create {ANY}
make
feature {ANY}
make
do
works_not
works
end
works_not
local ok: BOOLEAN
do
print ("%N%NAnzahl Argumente : " + argument_count.to_string + "%N")
print ("%NArgument -> Programmname : " + argument(0))
print ("%NArgument -> Wert : " + argument(1))
print ("%NArgument -> Währung : " + argument(2) + "%N")
ok := argument(2) = "€"
print ("%NArgument(2) ist Euro ? " + ok.to_string + "%N%N")
print ("don't work")
io.put_new_line
if argument(2) = "€" then
euro_in_dm(argument(1).to_real)
else
dm_in_euro(argument(1).to_real)
end
end
works
do
print ("works ")
io.put_new_line
if argument_count /= 2 then
print("%N%N Error (1) %N%N")
else
inspect
argument(2)
when "€" then
euro_in_dm(argument(1).to_real)
when "DM","dm" then
dm_in_euro(argument(1).to_real)
else
print("%N%N Error (2) %N%N")
end
end
end
feature
euro_in_dm (a: REAL)
do
io.put_string("%N Euro -> DM ")
io.put_real(a * 1.95583)
io.put_string("%N%N")
end
dm_in_euro (a: REAL)
do
io.put_string("%N DM -> Euro ")
io.put_real(a / 1.95583)
io.put_string("%N%N")
end
end
答案 0 :(得分:1)
问题出在比较运算符argument(2) = "€"
。
在Eiffel字符串中有一个引用类型,因此相等运算符=
会比较对字符串对象的引用,而不是它们的内容。如果要比较字符串值,则需要在检查两个操作数的类型完全相同或更健壮的版本{{1}之后使用内部调用~
的运算符is_equal
。 (只要它在您的环境版本中可用)。总而言之,您可以尝试以下方法之一而不是相等:
same_string
argument(2).same_string ("€")
argument(2) ~ "€"