2013-07-02 3 views
6

Oto krótki kod:Scala: aplikacja widzenia

import scala.language.implicitConversions 

implicit def str2int(str:String) = str.toInt 

object Container { 
    def addIt[A](x: A)(implicit str2int: A => Int) = 123 + x 
    def addIt2(x: String)(implicit str2int: String => Int) = 123 + x 
} 

println(Container.addIt("123")); 
println(Container.addIt2("123")); 

dwa pytania:

  1. jest "(niejawny str2int: A => int)" nazywa się widok? Kiedy mówisz "widok", która konkretna część kodu wskazuje?
  2. Dlaczego addIt zwraca 246, podczas gdy addIt2 zwraca ciąg "123123"?

Wszelkie dobre zasoby na ten temat również zostaną docenione. Dziękuję Ci.

Odpowiedz

4

Widok oznacza, że ​​typ A można "przeglądać" jako typ B, określony przez niejawną funkcję A => B. Tak, tak, oba niejawne argumenty w addIt i addIt2 są widokami.

addIt2 powraca 123123 ponieważ jest (niestety) można nazwać + na dwóch obiektach, gdzie jeden z nich jest String. To rozpoczyna się przed Scala wygląda na możliwość zastosowania konwersji str2int. Jeśli użytkownik nie chce, że można jawnie stosować widok:

def addIt2(x: String)(implicit str2int: String => Int) = 123 + str2int(x) 

Albo można ukryć any2stringadd konwersję:

object Container { 
    import Predef.{any2stringadd => _} 
    def addIt2(x: String)(implicit str2int: String => Int) = 123 + x 
} 
2
  1. tak jest niejawna widok, ale to nie robi "wskaż konkretną część kodu. Po prostu mówi, że typ A powinien być "wymienialny", najlepiej niejawnie dla typu Int, np. niejawny konwerter powinien znajdować się w zasięgu, gdy wywoływana jest ta metoda.

  2. Wygląda, gdy kompilator tłumaczy pierwszą metodę, która widzi 123. + (X: A) i próbuje znaleźć niejawny dla typu A, który skompiluje "+".

W drugim przypadku widzi 123. + (x: String) i istnieje takie niejawne przekształcenie w Predal Scala. W rzeczywistości jest to dziwactwo w implementacji Scala. Domniemana oświadczenie:

final class StringAdd(self: Any) { 
    def +(other: String) = self.toString + other 
} 

Został pozostawiony w Scala dla wygody byłych programistów Java, które są wykorzystywane do składnia jak: 123 + "something" i oczekiwać, że będzie ciąg.