2017-08-24 2 views
0

ich dies tun will, ist der Parameter faul und wiederholbare:Scala nach Namen wiederholt Parameter

def f(actions: (=> Try[String])*) = { 
    actions.map{x => 
    if(x.isFailure) throw new Exception() 
    ... 
    } 
} 

Also, ich Parameter mit diesem auswerten kann:

f(Try("a"), Try("b"), Try[String](new Exception()), Try({print("something"); "d"})) 

The print ("etwas") nie ausgeführt werden, weil Parameter faul ist.

eher dann:

def f(actions: (() => Try[String])*) = ??? 
f(() => Try("a"),() => Try("b"),() => Try[String](new Exception()),() => Try({print("something"); "d"})) 

Es ist einfach langweilig Schreibgefühl.
Unterstützt Scala die erste?

Antwort

3

Wrap mit Namen Parametern wie so:

implicit class ByNameWrapper[+A](a: => A) { def get: A = a } 

Und Ihre Methode definieren als

def f(actions: ByNameWrapper[Try[String]]*) { 
    ... 
} 

Verwendung der gleichen wie normaler Neben Namen Parameter ist:

f(Try { throw new Exception }, Try { println("a"); "b" }) 
+0

Vielleicht der einzige zur Zeit Lösung. Aber ich denke, es könnte besser sein, wenn die Sprache es unterstützt. – LoranceChen

1

Es kommt zu dotty. Oder es ist schon in Dotty.

https://github.com/lampepfl/dotty/issues/499

+1

Das ist die falsche Art von '=> A *', denke ich. Es wird als 'Function0 [Seq [A]]' interpretiert (mit dem Parameter in der Methode wird * all * der Argumente gleichzeitig ausgewertet). OP möchte 'Seq [Function0 [A]]', wobei jedes Argument einzeln ausgewertet wird. – HTNW

+0

@HTNW tl; dr ich denke. Keine Semantik ist in Scala. –

+0

Sorry für nicht Unterstützung '(=> T) *', es ist nur ein 'Lazy Val x: Seq [T]'. Ich brauche eigentlich ein 'val x: Stream [T]'. – LoranceChen