यहां कुछ कोड का नमूना है जो मैं काम कर रहा हूं जो सीधे राज्य को म्यूट करने के बजाए प्रतिलिपि वापस करने के दृष्टिकोण का उपयोग करता है।कम से कम सर्वर पक्ष पर इस तरह के दृष्टिकोण के बारे में अच्छी बात यह है कि यह मुझे लेनदेन-प्रकार अर्थशास्त्र को आसानी से कार्यान्वित करने में सक्षम बनाता है। यदि अद्यतन करते समय कुछ गलत हो जाता है, तो मेरे लिए अभी भी एक स्थिर स्थिति में अद्यतन की गई सभी चीज़ों के लिए यह छोटा है।
नीचे दिया गया कोड एक ऐसे गेम सर्वर से है जिस पर मैं काम कर रहा हूं, जो आप जो कर रहे हैं उसके समान कुछ करता है, यह उन वस्तुओं को ट्रैक करने के लिए है जो समय स्लाइस में घूम रहे हैं। यह दृष्टिकोण उतना शानदार नहीं है जितना डेव ग्रिफिथ सुझाव देता है, लेकिन यह आपके लिए चिंतन के लिए कुछ उपयोग हो सकता है। स्काला में मामला कक्षाओं के बारे में
case class PosController(
pos: Vector3 = Vector3.zero,
maxSpeed: Int = 90,
velocity: Vector3 = Vector3.zero,
target: Vector3 = Vector3.zero
) {
def moving = !velocity.isZero
def update(elapsed: Double) = {
if (!moving)
this
else {
val proposedMove = velocity * elapsed
// If we're about to overshoot, then stop at the exact position.
if (proposedMove.mag2 > pos.dist2(target))
copy(velocity = Vector3.zero, pos = target)
else
copy(pos = pos + proposedMove)
}
}
def setTarget(p: Vector3) = {
if (p == pos)
this
else {
// For now, go immediately to max velocity in the correct direction.
val direction = (p - pos).norm
val newVel = direction * maxSpeed
copy(velocity = direction * maxSpeed, target = p)
}
}
def setTargetRange(p: Vector3, range: Double) = {
val delta = p - pos
// Already in range?
if (delta.mag2 < range * range)
this
else {
// We're not in range. Select a spot on a line between them and us, at max range.
val d = delta.norm * range
setTarget(p - d)
}
}
def eta = if (!moving) 0.0 else pos.dist(target)/maxSpeed
}
एक अच्छी बात यह है कि वे you-- तुम सिर्फ पारित जिसमें मानकों को बदल दिया है के लिए विधि प्रति() बनाने के लिए, और दूसरों को एक ही मूल्य को बनाए रखने की है। यदि आप केस कक्षाओं का उपयोग नहीं कर रहे हैं, तो आप इसे हाथ से कोड कर सकते हैं, लेकिन जब भी आप कक्षा में कौन से मूल्य मौजूद हैं, तो आपको कॉपी विधि को अपडेट करना याद रखना होगा।
संसाधनों के संबंध में, वास्तव में मेरे लिए क्या अंतर आया, एरलांग में कुछ समय करने में व्यतीत कर रहा था, जहां मूल रूप से अपरिवर्तनीय स्थिति का उपयोग करने के अलावा कोई विकल्प नहीं है। मेरे पास दो एरलांग किताबें हैं जिनके माध्यम से मैंने काम किया और प्रत्येक उदाहरण को ध्यान से पढ़ा। इसके अलावा, एर्लांग में कुछ चीजें करने के लिए खुद को मजबूर करने के लिए मुझे अपरिवर्तनीय डेटा के साथ काम करने के साथ बहुत अधिक आरामदायक बना दिया।
सामान्य सर्वसम्मति (सभी उत्तरों के बीच) केवल मेरी वस्तुओं की प्रतियां बनाने के लिए प्रतीत होता है जो वर्तमान स्थिति का प्रतिनिधित्व करते हैं। यह वही नहीं है जो मैं खोज रहा था, लेकिन _this_ उत्तर विचारों के लिए कुछ वाकई दिलचस्प भोजन प्रस्तुत करता है जैसे कि इटरेटर्स को परिभाषित करना जो व्यक्त करता है कि मूल्य कैसे बदलते हैं (मूल्यों को व्यक्त करने के बजाए) ... मैं एक ऐसे उत्तर की उम्मीद कर रहा था जो मैं चाहता था कुछ प्रकार के फ़ंक्शन (या पुनरावृत्ति) के रूप में स्थिति को व्यक्त करने का कोई तरीका ढूंढें जो व्यक्त करेगा कि वेरिएबल परिवर्तन कैसे होते हैं (कैलकुस में एक अभिन्न अंग की तरह)। हालांकि, मुझे कुछ अच्छी चीजों के बारे में जानकारी देने के लिए धन्यवाद! – jtb