Liberty / ISE Eiffel中的If Statment出错

时间:2017-04-06 12:40:44

标签: utf-8 eiffel

我对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

1 个答案:

答案 0 :(得分:1)

问题出在比较运算符argument(2) = "€"

在Eiffel字符串中有一个引用类型,因此相等运算符=会比较对字符串对象的引用,而不是它们的内容。如果要比较字符串值,则需要在检查两个操作数的类型完全相同或更健壮的版本{{1}之后使用内部调用~的运算符is_equal。 (只要它在您的环境版本中可用)。总而言之,您可以尝试以下方法之一而不是相等:

  • same_string
  • argument(2).same_string ("€")
  • argument(2) ~ "€"