【问题标题】:what's wrong with renaming imported static functions?重命名导入的静态函数有什么问题?
【发布时间】:2010-09-06 10:51:35
【问题描述】:

考虑以下 Scala 代码:

    object MainObject {

    def main(args: Array[String]) {

      import Integer.{
        parseInt => atoi
      }

      println(atoi("5")+2);

      println((args map atoi).foldLeft(0)(_ + _));

  }

第一个 println 工作正常并输出 7,但第二个尝试将字符串数组映射到函数 atoi 不起作用,错误“值 atoi 不是对象 java.lang.Integer 的成员”

有什么区别?

【问题讨论】:

  • 也许您应该补充一点,使用println((args map Integer.parseInt).foldLeft(0)(_ + _)) 可以将重点放在导入/重命名上。

标签: scala import


【解决方案1】:

看起来像一个错误。这是一个更简单的例子。

object A {
  def a(x: Any) = x
  def b = ()
}

{
  A.a(0)
  A.a _
}

{
  import A.a
  a(0)
  a _
}

{
  import A.{a => aa}
  aa(0)
  aa _  //  error: value aa is not a member of object this.A
}

{
  import A.{b => bb}
  bb
  bb _
}

【讨论】:

    【解决方案2】:

    这是因为它无法判断使用哪个 atoi。有两种可能性 parseInt(String) 和 parseInt(String, int)。来自 REPL:

    scala> atoi <console>:7: error: ambiguous reference to overloaded definition, both method parseInt in object Integer of type (x$1: java.lang.String)Int and  method parseInt in object Integer of type (x$1: java.lang.String,x$2: Int)Int match expected type ?
           atoi
    

    您需要具体说明要使用哪一个,这将起作用:

    println((args map ( atoi(_))).foldLeft(0)(_ + _));
    

    【讨论】:

    • 为什么println((args map Integer.parseInt).foldLeft(0)(_ + _)) 工作没有问题?
    【解决方案3】:

    这不是您问题的答案,但您可以使用StringOps 中的toInt 方法而不是Integer.parseInt

    scala> Array("89", "78").map(_.toInt)
    res0: Array[Int] = Array(89, 78)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-11-13
      • 1970-01-01
      • 2012-10-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-01-03
      相关资源
      最近更新 更多