2010-05-14 8 views
14

प्रेषकों को एक और संदेश के साथ जवाब देने वाले कलाकारों के बहुत सारे उदाहरण हैं, लेकिन एपीआई दस्तावेज़ों को ब्राउज़ करते समय मैंने देखा !! तथा !? ऑपरेटरों जो CanReply विशेषता का हिस्सा हैं (जो 2.8: http://www.scala-lang.org/archives/rc-api/scala/actors/CanReply.html के लिए नया प्रतीत होता है)। इसलिए मैं सोच रहा था कि क्या यह प्राप्त करने का एक मामला था/प्रतिक्रिया ब्लॉक एक मूल्य लौटाता है, यानी यूनिट के अलावा आंशिक फ़ंक्शन वापसी प्रकार कुछ बनाते हैं?स्कैला कलाकार कैसे संदेश के जवाब में एक मूल्य वापस कर सकते हैं?

मैं स्रोत के माध्यम से खोदना शुरू कर दूंगा कि वे इसका उपयोग करने के लिए कैसे काम कर रहे हैं, लेकिन अगर किसी के पास कोई अंतर्दृष्टि है या गहन दस्तावेज़ीकरण या उदाहरणों के बारे में पता है तो मैं सबसे आभारी हूं ।

चीयर्स, पॉल।

import scala.actors._ 
class Reverser extends Actor { 
    def act() { Actor.loop { react { 
    case s: String => Thread.sleep(1000); reply(s.reverse) 
    case _ => exit() 
    }}} 
} 

तीन तरीके स्पष्ट जबाब स्वीकार करने के लिए कर रहे हैं: जैसा कि यहाँ दिखाया

उत्तर

22

जवाब, विधि reply साथ भेजा जा सकता है।

  • उपयोग !! है, जो एक Future देता है, जो एक कंटेनर वर्ग जब आपको उनकी आवश्यकता आप सामग्री देने का वादा किया है। यह तुरंत लौटता है, लेकिन यदि आप वास्तव में सामग्री के लिए पूछते हैं, तो आपको अन्य थ्रेड पूरा होने तक इंतजार करना होगा और अनुरोध भरना होगा।
  • बिना टाइमआउट के !? का उपयोग करें। आपका कोड तब तक रुक जाएगा जब तक कि अन्य थ्रेड के उत्तर देने में लगे।
  • टाइमआउट के साथ !? का उपयोग करें। आपका कोड तब तक रुक जाएगा जब तक कि यह कोई जवाब न हो या जब तक टाइमआउट समाप्त नहीं हो जाता, जो भी पहले आता है।

यहाँ इन तीनों का एक उदाहरण है:

val r = new Reverser 
r.start 
val a = (r !! "Hi") 
a() match { 
    case s: String => println(s) 
    case _ => println("Error A") 
} 
val b = r !? "Hello" 
b match { 
    case s: String => println(s) 
    case _ => println("Error B") 
} 
val c = (r !? (500,"Howdy")) 
c match { 
    case Some(s: String) => println(s) 
    case Some(_) => println("Error C") 
    case None => println("Too slow!") 
} 
r ! None // None isn't a string, so r will stop running 

और तुम

iH 
elloH 
Too slow! 
+0

कि के लिए धन्यवाद प्राप्त करता है, तो आप इस चलाने! मैं भी अपने आप को खोज का एक सा था और यह पाया: http://java.dzone.com/articles/scala-threadless-concurrent जो यह की तिथि के अनुसार चलता है कि ऑपरेटरों नहीं नई 2.8, यहां तक ​​कि कर रहे हैं अगर CanReply विशेषता है। – pdbartlett

+1

@pdbartlett: यह सही है। उपर्युक्त कोड 2.7 में भी काम करेगा, सिवाय इसके कि '.reverse' 2.7 में स्ट्रिंग का उत्पादन नहीं करता है, इसलिए उदाहरण तब तक काम नहीं करेगा जब तक आप' .reverse.toString' नहीं करते। लेकिन सभी अभिनेता/भविष्य की चीज़ें ठीक काम करती हैं। –

संबंधित मुद्दे