2010-09-06 56 views
3

考慮以下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的成員「

有什麼區別?

+1

也許你應該補充的是使用'調用println((參數映射的Integer.parseInt).foldLeft(0)( - + - ))'工程,將重點放在進口/重命名。 – Debilski 2010-09-06 11:57:48

回答

4

這是因爲它無法分辨使用哪個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)(_ + _)); 
+0

我不認爲這是一個問題。 http://pastebin.com/Ac6FKD2b – missingfaktor 2010-09-06 11:56:42

+0

爲什麼'println((args map Integer.parseInt).foldLeft(0)(_ + _))'沒有問題? – Debilski 2010-09-06 11:56:51

+0

它的工作原理。 (atoi(_))是解決方案 – 2010-09-07 08:09:43

5

看起來像一個錯誤。這是一個更簡單的例子。

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

這不是一個回答你的問題,但你可以使用toInt方法從StringOps代替Integer.parseInt

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