【问题标题】:Scala - Why does dotless not apply to this caseScala - 为什么 dotless 不适用于这种情况
【发布时间】:2015-10-26 20:50:33
【问题描述】:

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

这是不起作用的代码:

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

错误是:not found: value toDouble

但是,它确实是这样工作的:

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

text 只返回一个String 并且不带参数,而且我没有看到\\ 中需要任何其他参数来导致问题。

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

而且我也不能在没有点的情况下使用head。删除点时显示:Cannot resolve symbol head

【问题讨论】:

    标签: scala


    【解决方案1】:

    这是因为text 是一个后缀 表示法——这意味着方法跟随对象并且 不带参数。后缀的诀窍在于它只能出现在 end 表达式中。这就是为什么当您添加括号时它起作用的原因(表达式然后由括号限制并且您得到两个后缀符号,一个以 text 结尾,第二个以 toDouble 结尾) .在您的示例中,情况并非如此,因为您试图在链中进一步调用方法。

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

    Scala 中还有 prefixinfix 符号,我建议您阅读它们以了解何时可以跳过 .() (例如为什么在使用map 方法时需要() 等)。

    【讨论】:

    • 就在您发布答案时,我发现了这个:stackoverflow.com/questions/1181533/…。不知怎的,我觉得它应该被更好地编入索引......不过,非常感谢你!
    • @AleksandarStojadinovic 哦,这是一个了不起的答案,人们绝对应该阅读它:-)
    【解决方案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。

    【讨论】:

    • 这很奇怪,我没有看到那个警告。
    • 只有在使用 -feature scalac 标志时才能看到它。所以也许very微妙会是一个更好的词。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-07-10
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多