2016-04-23 7 views
3

Ich möchte wie diese eine Funktion mit impliziten Parameter in einer Weise definieren:Scala: Wie definiert man anonyme Funktion mit impliziten Parameter?

// imports to add scope of A 

{ 
    implicit a: A => { 
    // some action 
    } 
}.apply() 

// somewhere in the code   

class A 

val a: A = new A 

Aber mein Scala Compiler es nicht kompilieren. Es sagt: Cannot resolve reference apply with such signature. Der Parameter ist jedoch implizit, daher sollte der Compiler im Bereich nachschlagen und ein geeignetes Objekt finden.

Ist es wahr? Wenn nicht, wie kann ich das beheben?

+0

Es ist wirklich nicht klar, was Sie erreichen wollen, zumindest für mich –

+0

Ich möchte eine Funktion auslösen und zwingen, impliziten Parameter zu verwenden. Ich möchte den Parameter nicht explizit an die Funktion übergeben. – barbara

+0

Oh ok Ich verstehe, was du meinst, ich habe den "anonymen" Teil der Frage übersprungen. Sie können dann nicht, nur Methoden können implizite Parameter haben –

Antwort

5

Sie können nicht. Nur Methoden können implizite Parameter haben.

Wenn Sie dies tun:

// val f: A => Unit = 
{ 
    implicit a: A => { 
    // some action 
    } 
} 

Sie tatsächlich eine anonyme Funktion vom Typ A => Unit erklärt und erklären Sie das Argument a als implizite in der Funktionskörper


Sie kann mit dem Magnetmuster etwas erreichen, was Sie wollen:

class A 

case class Magnet() 
object Magnet { 
    implicit def fromUnit(arg1: Unit)(implicit a: A) = Magnet() 
} 

object Test extends App { 

    implicit val a = new A 

    { 
    args: Magnet => { 
     //... 
    } 
    }.apply() 
} 

Sie werden eine deprecation Warnung aber erhalten, weil der Magnet zumindest einen Parameter haben muss und ich Unit, sollten Sie es wie .apply(()) nennen es

2

Wie Giovanni sagte zu vermeiden: Sie können nicht so haben ein Parameter

Sie können jedoch implicitly verwenden implicits in Ihrer Funktion zu beheben:

case class Foo(text : String) 
implicit val foo = Foo("World") 

(() => { 
    val implFoo : Foo = implicitly[Foo] 
    println(s"Hello ${implFoo.text}") 
}).apply() 

(Aber um ehrlich zu sein, das klingt wie es besser geschrieben werden können, und Sie werden in Spaghetti-Code Gebiet mit dem, was Sie‘ re do.)