2010-11-10 54 views
4

这是一个在我的代码中发现的相当困难的错误,但是一旦我发现它,我很惊讶编译器没有捕获它或了解它为什么有效。Scala字符串Concatenation问题

val my_string = 
    "abc" + 
    "def" 
    "ghi" 

my_string的价值最终是"abcdef"因为我"def"后错过了+迹象。为什么没有编译器抱怨,"ghi"发生了什么?

+0

现在在三重引号括多行字符串,以避免将来错误 – 2010-11-10 16:47:22

+3

通常的做法是包在括号内的表达式的所有令牌,以避免这样的问题,例如,VAL my_string =( ...) – 2010-11-10 20:27:29

+0

@Alex好主意啊! – 2010-11-10 22:39:11

回答

10

该代码有效,因为"ghi"本身就是一个有效的表达式。

如果这是一个函数内部(而不是其他任何内容),那么"ghi"是该函数的返回值。否则就会被忽略(就像你自己写了42 + 23一样)。

+0

它在我的类中被声明为一个实例变量。我想你会无法参考它,它会执行并继续前进? – 2010-11-10 16:24:26

+0

@Mark:类体中的任何表达式都被认为是构造函数的一部分。所以每次创建类的一个实例时,都会评估表达式''ghi''(它根本没有任何影响)。 – sepp2k 2010-11-10 16:32:03

+0

没错!我记得现在读/我感谢它,谢谢 – 2010-11-10 16:37:47

1

“ghi”只是String类型的表达式,为什么编译器会抱怨?

+0

,因为在java中它不是陈述,所以它是合乎逻辑的假设编译器会失败,如果你来自Java世界 – yura 2011-06-04 13:15:54

+0

@yura:是的,但这不是Java,你应该不要把Scala看作带有一些“扩展”的Java的错误。我发现,如果你正在学习Scala,那么最有用的思维转变就是理解* * everything *只是一个表达式,可以用来评估某些东西。 – hbatista 2011-06-07 09:44:38