运行锡兰教程代码时出错

时间:2016-04-13 21:32:05

标签: ceylon

我正在关注此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

我已复制/粘贴此代码,但仍然是相同的消息。

2 个答案:

答案 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要求使用非可选StringparseFloat(null)是不允许的。因此,您必须assert userX存在:

assert (exists userX = process.readLine());

value userX = process.readLine();
assert (exists userX);

这两种形式都使userX成为非可选变量。