स्कैला के परिप्रेक्ष्य से join
विधियों में कुछ भी सामान्य नहीं है लेकिन उनका नाम है, इसलिए बहुत सारे बॉयलरप्लेट (या कस्टम मैक्रो) के बिना इन संदर्भों में उनका उपयोग करना वास्तव में संभव नहीं है। इसके बजाय ट्विटर पर Future
पर बार-बार join
का उपयोग करना संभव है। आप एक नए प्रकार के वर्ग बनाकर ऐसा कर सकते हैं:
import shapeless._
trait FutureSequence[L <: HList] extends DepFn1[L]
इस प्रकार का वर्ग गवाह होगा कि एक hlist L
वायदा की पूरी तरह से बना है, और यह हमें एक Future[T]
, जहां में उन वायदा क्रम के लिए एक रास्ता दे देंगे T
L
(*->*
) में प्रत्येक वायदा के अंदर के प्रकारों से बना हुआ टुपल है, जो हमें इसका पहला हिस्सा देता है, लेकिन दूसरी सुविधा का समर्थन नहीं करता है, या दूसरे भाग को आसानी से करने का कोई भी तरीका नहीं है)।
साथी वस्तु सभी दिलचस्प काम करता है:
import com.twitter.util.Future
import shapeless.ops.tuple.Prepend
object FutureSequence {
type Aux[L <: HList, Out0] = FutureSequence[L] { type Out = Out0 }
implicit def hnilFutureSequence: Aux[HNil, Future[Unit]] =
new FutureSequence[HNil] {
type Out = Future[Unit]
def apply(l: HNil): Future[Unit] = Future.Unit
}
implicit def hconsFutureSequence[H, T <: HList, OutT](implicit
fst: Aux[T, Future[OutT]],
pre: Prepend[Tuple1[H], OutT]
): Aux[Future[H] :: T, Future[pre.Out]] = new FutureSequence[Future[H] :: T] {
type Out = Future[pre.Out]
def apply(l: Future[H] :: T): Future[pre.Out] =
l.head.join(fst(l.tail)).map {
case (h, t) => pre(Tuple1(h), t)
}
}
}
हम प्रेरण का उपयोग कर रहे यहाँ-पहले हम HNil
(हमारे आधार मामले) अनुक्रम के तरीके का वर्णन, और फिर हम क्रम के लिए कैसे Future[H] :: T
यह देखते हुए कि वर्णन हम जानते हैं कि T
अनुक्रम कैसे करें।
अगला हम उपयोग करने के लिए यह आसान बनाने के लिए एक विधि को परिभाषित करेंगे:
def sequence[L <: HList](l: L)(implicit fs: FutureSequence[L]): fs.Out = fs(l)
और फिर अगर हम कुछ उदाहरण मिल गया है:
val good = Future(1) :: Future("string") :: Future(true) :: HNil
val bad = Future(1/0) :: Future("string") :: Future(true) :: HNil
हम उन्हें क्रम सकते हैं:
scala> import com.twitter.util.Await
import com.twitter.util.Await
scala> Await.result(sequence(good))
res0: (Int, String, Boolean) = (1,string,true)
scala> sequence(bad).onFailure(println)
java.lang.ArithmeticException:/by zero
res1: com.twitter.util.Future[(Int, String, Boolean)] = ...
आपको अपने कक्षा के कन्स्ट्रक्टर में FutureSequence
उदाहरण की आवश्यकता हो सकती है, या यो पर विशिष्ट तरीकों पर यूआर कक्षा
@TravisBrown यह वर्तमान में एक ट्विटर भविष्य 'Future.join' के साथ शामिल हो गया है। नया 'Futures.join' अधिभार संभवतः मेरे अभ्यास के उद्देश्य के लिए' एचएलआईटी 'अनुकूल संस्करण में फिर से लिखा जा सकता है, लेकिन मुझे एचएलिस्ट से टुपल तक varargs तक जाने और आकार प्राप्त करने के लिए आकारहीन ओप के बारे में पर्याप्त जानकारी नहीं है। – flavian
आह, क्षमा करें-बहुत जल्दी पढ़ना। ओवरलोडेड 'जॉइन' विधियों का उपयोग करना संभवतः व्यावहारिक रूप से नहीं है, लेकिन 'शामिल' करने के लिए नेस्टेड जोड़ी कॉल का उपयोग करना संभव है- मैं इस शाम को एक उदाहरण डाल सकता हूं अगर कोई मुझे इसके साथ मारता है। –