что не так с переименованием импортированных статических функций? - PullRequest
3 голосов
/ 06 сентября 2010

Рассмотрим следующий код 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»

Какая разница?

Ответы [ 3 ]

5 голосов
/ 06 сентября 2010

Похоже, ошибка. Вот более простой пример.

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 _
}
4 голосов
/ 06 сентября 2010

Это потому, что он не может сказать, какой atoi использовать. Есть две возможности parseInt (String) и parseInt (String, int). Из отчета:

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)(_ + _));
2 голосов
/ 06 сентября 2010

Это не ответ на ваш вопрос, но вы можете использовать метод toInt из StringOps вместо Integer.parseInt.

scala> Array("89", "78").map(_.toInt)
res0: Array[Int] = Array(89, 78)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...