我正在关注此tutorial,它正在给我这段代码:
"Run the module `hello.ceylon`."
shared void run() {
process.write("Enter a number (x): ");
value userX = process.readLine();
value x = parseFloat(userX);
process.write("Enter a number (y): ");
value userY = process.readLine();
value y = parseFloat(userY);
if (exists x, exists y) {
print("``x`` * ``y`` = ``x * y``");
} else {
print("You must enter numbers!");
}
}
但它给了我这样的信息:
参数必须可分配给parseFloat:String的参数字符串?不能赋予String
我已复制/粘贴此代码,但仍然是相同的消息。
答案 0 :(得分:3)
我是本教程的作者。
非常抱歉,此示例代码不再起作用(它与Ceylon 1.0.0一起使用,见下文)。
我已经在教程中修复了它并在Ceylon Web IDE中创建了一个runnable sample,你可以用来试试这个。
基本上,问题在于,正如Lucas Werkmeister指出的那样,readLine()返回String?
,这相当于String|Null
,因为它可能无法从输入中读取任何内容(用户的键盘),在这种情况下,你会得到null
。
代码示例与Ceylon 1.0.0一起使用,因为readLine()
曾用于返回String
。
因此,对于要编译的代码,您需要确保检查您返回的内容exists
(即不是null
):
value userX = process.readLine();
value x = parseFloat(userX else "");
当您执行userX else ""
时,您告诉Ceylon如果userX
存在,则应使用该值,否则请使用""
。这样,我们总是得到String
回来......
整个代码段应如下所示(请参阅上面链接的示例):
process.write("Enter a number (x): ");
value userX = process.readLine();
value x = parseFloat(userX else "");
process.write("Enter a number (y): ");
value userY = process.readLine();
value y = parseFloat(userY else "");
if (exists x, exists y) {
print("``x`` * ``y`` = ``x * y``");
} else {
print("You must enter numbers!");
}
感谢您报告错误!希望您喜欢本教程的其余部分。
答案 1 :(得分:1)
process.readLine()
会返回String?
,如果它可以读取一行,则返回String
;如果不能读取,则返回null
(例如,流的结尾)。 parseFloat
要求使用非可选String
:parseFloat(null)
是不允许的。因此,您必须assert
userX
存在:
assert (exists userX = process.readLine());
或
value userX = process.readLine();
assert (exists userX);
这两种形式都使userX
成为非可选变量。