मैं स्कैला 2.10 वायदा का उपयोग कर एसिंक लाइब्रेरी बना रहा हूं। लाइब्रेरी के लिए कन्स्ट्रक्टर उपयोगकर्ता परिभाषित ऑब्जेक्ट्स का एक अनुक्रम लेता है जो एक निश्चित विशेषता को लागू करता है, और उसके बाद लाइब्रेरी क्लास पर एक विधि उपयोगकर्ता द्वारा परिभाषित वस्तुओं में एक-एक करके कुछ डेटा भेजती है। मैं चाहता हूं कि उपयोगकर्ता मुख्य उदाहरण स्थापित करते समय एसिंक ऑपरेशंस के लिए ExecutionContext
प्रदान करें, और उसके बाद उस संदर्भ के लिए उपयोगकर्ता द्वारा परिभाषित वस्तुओं में आवश्यक हो। सरलीकृत (? छद्म) कोड:निहित ऑब्जेक्ट्स को कॉन्टेक्स्ट करने के लिए निहित ऑब्जेक्ट्स/कॉल विधियों
case class Response(thing: String)
class LibraryObject(stack: Seq[Processor])(implicit context: ExecutionContext) {
def entryPoint(data: String): Future[Response] = {
val response = Future(Response(""))
stack.foldLeft(response) { (resp, proc) => proc.process(data, resp) }
}
}
trait Processor {
def process(data: String, resp: Future[Response]): Future[Response]
}
वह कुछ इस तरह इस्तेमाल किया जा सकता है:
class ThingProcessor extends Processor {
override def process(data: String, response: Future[Response]) = {
response map { _.copy(thing = "THE THING") }
}
}
class PassThroughProcessor extends Processor {
override def process(request: Request, response: Future[Response]) = {
response
}
}
object TheApp extends App {
import ExecutionContext.Implicits.global
val stack = List(
new ThingProcessor,
new PassThroughProcessor
)
val libObj = new LibraryObject(stack)
val futureResponse = libObj.entryPoint("http://some/url")
// ...
}
मैं ThingProcessor
के लिए एक संकलन त्रुटि मिलती है:
आयात करेंएक अंतर्निहित ExecutionContext नहीं खोजा जा सका , या तो खुद को एक की आवश्यकता है या
ExecutionContext.Implicits.global
मेरे सवाल है, मैं कैसे परोक्ष की आपूर्ति करते हैं उपयोगकर्ता परिभाषित वस्तुओं (ThingProcessor
और PassThroughProcessor
) या उपयोगकर्ता (जो कक्षाओं लेखन किया जाएगा) इसके बारे में चिंता किए बिना उनके तरीकों को LibraryObject
है ExecutionContext
कि - जो है कहने के लिए, मैं पसंद करेंगे उपयोगकर्ता था कि नहीं लिखने की आवश्यकता:
class MyFirstProcessor(implicit context: ExecutionContext)
या
override def process(...)(implicit context: ExecutionContext) = { ... }
यह सिंगलटन वस्तुओं के लिए नहीं करेगा, स्पष्ट रूप से ... क्या आप एक कामकाज के बारे में सोच सकते हैं? –
@ pagoda_5b क्या आप अपडेट की तरह हैं? अगर मैं स्पष्ट रूप से सोच नहीं रहा हूं तो अग्रिम क्षमा करें। –
हाँ, बहुत चिकना दिखता है और मुझे यह पसंद है। –