दो समाधान, उन दोनों स्पष्ट पुनरावर्ती पाश परिभाषा, अक्का एफ # अभिनेताओं की मुख्य अवधारणा का उपयोग कर रहे हैं।
सबसे पहले आप (क्योंकि परिवर्तनशील चर बंद से काटा नहीं जा सकता, नीचे मैं सेल संदर्भ के लिए i
परिभाषा बदल दी है उदाहरण में) चर, जो केवल अभिनेता के दायरे के अंदर दिखाई देना चाहिए, पाश परिभाषा से पहले परिभाषित कर सकते हैं:
let actorRef =
spawn system "my-actor" <| fun mailbox ->
let i = ref 1
let rec loop() =
actor {
let! msg = mailbox.Receive()
match msg with
| Some x -> i := !i + x
| None ->()
return! loop()
}
loop()
हालांकि, अधिक सलाह दी समाधान सिर्फ इस तरह संदेश से निपटने के दौरान अपरिवर्तनीय अपने राज्य रखने के लिए, और केवल इसे बदल जब अगले पाश कॉल में गुजर, है:
let actorRef =
spawn system "my-actor" <| fun mailbox ->
let rec loop i =
actor {
let! msg = mailbox.Receive()
match msg with
| Some x -> return! loop (i + x)
| None -> return! loop i
}
loop 1 // invoke first call with initial state
आप नहीं हैं कि क्या कर रहे हैं खोज रहे हैं, लेकिन [एफ # एजेंटों के लिए, बेवकूफ दृष्टिकोण राज्य को ले जाने के लिए एक रिकर्सिव लूप का उपयोग करना है] (https://msdn.microsoft.com/en-us/library/ee370357.aspx)। हालांकि, अगर Akka.NET आपको उत्परिवर्तन उन्मुख मार्ग से नीचे ले जाता है, तो यह 'अच्छी तरह से' करना असंभव साबित हो सकता है। क्या आप 'प्राप्तकर्ता' से प्राप्त करने के अलावा अन्य तरीकों से Akka.NET के लिए एक अभिनेता को कार्यान्वित कर सकते हैं? कुछ ऐसा जो आपको रिकर्सिव पोल लूप का उपयोग करने में सक्षम बनाता है? –
बीटीडब्ल्यू, अगर कोई और मूर्खतापूर्ण समाधान है, तो मैं इसके बारे में सिर्फ अनजान हूं, और साथ ही शिक्षित होना चाहता हूं :) –