2016-06-03 8 views
-3

Dieser Code funktioniert nicht!Scala Puzzle: Irgendwelche Ideen, wie das funktioniert?

def add(a: Int, b: Int): Int = a plus b 

So habe ich versucht, plus wie so definieren: noch beklagt Cannot resolve symbol plus

def plus(a: Int, b: Int): Int = a + b 

Aber der Compiler!

Irgendwelche Ideen?

+0

Raue Menge. Gute Scala n00b Frage, oder so dachte ich. +1 –

+0

Danke! Obwohl ich seit einiger Zeit Scala benutze, habe ich selten implizite Klassen benutzt! – iyerland

Antwort

4

a plus b funktioniert nicht, weil es für a.plus(b) Kurzschreibweise ist und es gibt keine solche Methode auf Int in der Standardbibliothek. Um dies zu ermöglichen, müssen Sie die Klasse Int durch implizite Konvertierung "erweitern".

implicit class MyPlus[T](a: T)(implicit ev:Numeric[T]) { 
    def plus(b: T): T = ev.plus(a,b) 
} 

Jetzt können Sie tun 3 plus 5 oder a plus b usw.

Sie können es auch so machen (ein wenig kürzer und lesbarer, aber im Wesentlichen dasselbe ist):

import Numeric.Implicits._ 
implicit class MyPlus[T: Numeric](a: T) { 
    def plus(b: T): T = a + b 
} 
+0

Danke! Sehr geschätzt! – iyerland

1

Da a innerhalb add ist ein Int und scala.Int hat kein plus Methode, die wir von scala.Int etwas eine implizite Konvertierung erstellen müssen, die eine Int wickelt und hat eine plus Methode:

implicit class IntWithPlus(val i: Int) extends AnyVal { 
    def plus(other: Int) = i + other 
} 

nun, alles ist möglich:

def add(a: Int, b: Int): Int = a plus b 

add(2, 3) 
// => 5 

eine Alternative wäre, eine Art zu schaffen Int, das in den lokalen Namespace Shadowing scala.Int importiert wird und geben Sie diesen Typ eine plus Methode.

+0

Danke! Sehr geschätzt! – iyerland

Verwandte Themen