我正在解析一些XML,而我正在链接没有点的调用。所有这些方法都没有参数(\\
除外,它只需要一个),所以应该可以将它们链接起来而不是一个点,对吗?
这是不起作用的代码:
val angle = filteredContextAttributes.head \\ "contextValue" text toDouble
错误是:not found: value toDouble
然而,它确实如下:
(filteredContextAttributes.head \\ "contextValue" text) toDouble
text
仅返回String
并且不接受参数,我在\\
中看不到任何其他需要引起问题的参数。
我错过了什么?我不想破解它,而是要了解问题所在。
如果没有点,我也不能使用head
。删除点后,它会显示:Cannot resolve symbol head
答案 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>