2010-03-10 11 views

Odpowiedz

18

niejawne funkcje jednym argumentem są wykorzystywane do automatycznej konwersji wartości oczekiwanej typu. Są one znane jako niejawne wyświetlenia. Z dwoma argumentami to nie działa lub ma sens.

Można zastosować niejawny widoku do TupleN:

implicit def intsToString(xy: (Int, Int)) = "test" 
val s: String = (1, 2) 

Można również zaznaczyć ostateczną listę parametrów dla każdej funkcji jako niejawna.

def intsToString(implicit x: Int, y: Int) = "test" 
implicit val i = 0 
val s: String = intsToString 

Albo, łącząc te dwa zwyczaje implicit:

implicit def intsToString(implicit x: Int, y: Int) = "test" 
implicit val i = 0 
val s: String = implicitly[String] 

Jednak nie jest to bardzo przydatne w tym przypadku.

UPDATE

Aby rozwinąć komentarzem Marcina, jest to możliwe.

implicit def foo(a: Int, b: Int) = 0 
// ETA expansion results in: 
// implicit val fooFunction: (Int, Int) => Int = (a, b) => foo(a, b) 

implicitly[(Int, Int) => Int] 
+0

Czy sugerować (:-)), że mój oryginalny DEF (co nie mieć niejawną listę parametrów) nie można wywoływać niejawnie? (Oznacza to, że słowo "niejawne" w moim przykładzie jest całkowicie pozbawione sensu - jeśli żaden kod nie zauważy różnicy). Czy tak jest naprawdę? Czy jest to zamierzone jako częściowa odpowiedź, w sensie "hej, przynajmniej te sprawy działają"? –

+1

Prawidłowo. Wiem, że w obecnym języku wiem, w jaki sposób można się na to powoływać. Ostrzeżenie o kompilacji może być pomocne w zakomunikowaniu tego faktu. – retronym

+7

Oryginalna funkcja nie może być używana jako niejawna konwersja, ponieważ pobiera dwa parametry. Jednak nadal może być używany jako niejawny argument dla innej metody. Tak więc modyfikator 'niejawny 'ma tutaj przydatne znaczenie. –

4

odpowiedź Jason zdobywa się jedną bardzo ważną sprawę: niejawny funkcji z wieloma argumentami, gdzie wszystko ale pierwsze są ukryte ... to wymaga dwóch list parametrów, ale które nie wydają się być poza zakresem podano sposób wyrażenia pytania.

Oto przykład z niejawna konwersja który trwa dwa argumenty,

case class Foo(s : String) 
case class Bar(i : Int) 

implicit val defaultBar = Bar(23) 

implicit def fooIsInt(f : Foo)(implicit b : Bar) = f.s.length+b.i 

Przykładowa sesja REPL,

scala> case class Foo(s : String) 
defined class Foo 

scala> case class Bar(i : Int) 
defined class Bar 

scala> implicit val defaultBar = Bar(23) 
defaultBar: Bar = Bar(23) 

scala> implicit def fooIsInt(f : Foo)(implicit b : Bar) = f.s.length+b.i 
fooIsInt: (f: Foo)(implicit b: Bar)Int 

scala> val i : Int = Foo("wibble") 
i: Int = 29 
Powiązane problemy