【问题标题】:semantics behind _ in Scala method callsScala 方法调用中 _ 背后的语义
【发布时间】:2012-05-23 11:44:09
【问题描述】:

斯卡拉 2.9.2 这编译得很好

object AppBuilder extends App {

  def app( blockw: Int => String ) : List[String] = List( blockw(6) )

  def app( block: => String ) : List[String] = app( _ => block )
}

但在 REPL 中,与上面相同的方法/函数(不确定此处的区别),当不包含在类中时,我得到以下错误

scala> def app( blockw: Int => String ) : List[String] = List( blockw(6) )
app: (blockw: Int => String)List[String]

scala> def app( block: => String ) : List[String] = app( _ => block )
<console>:8: error: missing parameter type
       def app( block: => String ) : List[String] = app( _ => block )
                                                     ^

【问题讨论】:

    标签: scala


    【解决方案1】:

    REPL 目前不支持重载方法——请参阅this answer 了解原因。你可以用一个更简单的例子来证明这一点:

    scala> def f(x: Int) = x
    f: (x: Int)Int
    
    scala> def f(x: String) = x
    f: (x: String)String
    

    现在试试f(0),你会发现类型不匹配。

    您可以使用粘贴模式作为解决方法:

    scala> :paste
    // Entering paste mode (ctrl-D to finish)
    
    def app( blockw: Int => String ) : List[String] = List( blockw(6) )
    def app( block: => String ) : List[String] = app( _ => block )
    
    // Exiting paste mode, now interpreting.
    
    app: (blockw: Int => String)List[String] <and> (block: => String)List[String]
    app: (blockw: Int => String)List[String] <and> (block: => String)List[String]
    

    但是avoiding overloading 可能会更好。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-05-12
      • 1970-01-01
      • 2023-03-16
      相关资源
      最近更新 更多