没有定义对象的中缀表示法中的方法

时间:2016-07-08 13:36:05

标签: scala infix-notation

我有以下Scala对象:

object myCls {
  def main(args: Array[String]) = {
    print getString()
  }

  def getString(): String = {
    return "myString"
  }
}

在线:

print getString() 

我遇到了问题:

Cannot resolve symbol getString

这种方法有什么问题?

1 个答案:

答案 0 :(得分:4)

如果你看一下规范中Infix Expression的定义,你会看到:

InfixExpr    ::=  PrefixExpr
               |  InfixExpr id [nl] InfixExpr
PrefixExpr   ::=  [`-' | `+' | `~' | `!'] SimpleExpr
SimpleExpr   ::=  `new' (ClassTemplate | TemplateBody)
               |  BlockExpr
               |  SimpleExpr1 [`_']

当Scala编译器查看infix notation的语法时,其形式为:

PrefixExpr
| InfixExpr id [nl] InfixExpr`

我们可以将其视为object -> method -> parameters (0 or 1)

在您发布的示例中,由于printPredef中定义的方法(隐式导入),因此我们在PrefixExpr之前没有[Identifier[NewLine]]

为了实现这一点,我们需要明确地通过print调用Predef

scala> :pa
// Entering paste mode (ctrl-D to finish)

def getString(): String = {
    "myString"
  }

// Exiting paste mode, now interpreting.

getString: ()String

scala> print getString()
<console>:11: error: missing arguments for method print in object Predef;
follow this method with `_' if you want to treat it as a partially applied function
       print getString()
       ^

scala> Predef print getString()
myString
scala>

由于getString是arity-0,我们也可以删除它周围的括号:

scala> Predef print getString
myString