Scala - 为什么dotless不适用于这种情况

时间:2015-08-04 12:32:42

标签: scala

我正在解析一些XML,而我正在链接没有点的调用。所有这些方法都没有参数(\\除外,它只需要一个),所以应该可以将它们链接起来而不是一个点,对吗?

这是不起作用的代码:

val angle = filteredContextAttributes.head \\ "contextValue" text toDouble

错误是:not found: value toDouble

然而,它确实如下:

(filteredContextAttributes.head \\ "contextValue" text) toDouble

text仅返回String并且不接受参数,我在\\中看不到任何其他需要引起问题的参数。

我错过了什么?我不想破解它,而是要了解问题所在。

如果没有点,我也不能使用head。删除点后,它会显示:Cannot resolve symbol head

2 个答案:

答案 0 :(得分:3)

这是因为text后缀表示法 - 这意味着方法跟随对象并且不带参数。 postfix的技巧是它只能出现在 end 表达式中。这就是为什么当你添加括号时它是有效的(表达式然后由括号限定,你得到两个后缀符号,一个以文本结尾,第二个以 toDouble 结尾) 。在您的示例中,并非如此,因为您尝试在链中进一步调用方法。

这也是您需要filteredContextAttributes.head而不是filteredContextAttributes head的原因。我确定如果你做(filteredContextAttributes head)它会再次起作用,后缀符号将在表达式的末尾!

Scala中还有前缀中缀符号,我建议您阅读有关它们的内容,以便在您可以跳过.和{ {1}}(例如,在使用()方法等时需要()的原因。)。

答案 1 :(得分:2)

要添加@Mateusz已经回答的内容,这是因为混合了后缀表示法和arity-0 suffix notation

在另一个答案中也有一个很好的写作:https://stackoverflow.com/a/5597154/125901

您甚至可以在较短的示例中看到警告:

scala> filteredContextAttributes.head \\ "contextValue" text
<console>:10: warning: postfix operator text should be enabled
by making the implicit value scala.language.postfixOps visible.
This can be achieved by adding the import clause 'import scala.language.postfixOps'
or by setting the compiler option -language:postfixOps.
See the Scala docs for value scala.language.postfixOps for a discussion
why the feature should be explicitly enabled.

这是一个非常微妙的暗示,这不是最好的构造风格。因此,如果您不是专门在DSL中工作,那么您应该更喜欢添加明确的点和括号,尤其是在混合使用中缀,后缀和/或后缀符号时。

例如,您可以选择doc \\ "child"而不是doc.\\("child"),但是当您走出DSL时 - 在此示例中,当您获得NodeSeq时 - 更喜欢添加perens。< / p>