Scala sürekliliği ile ilgili bir sorudur. resets
iç içe geçebilir mi? Eğer yapabilirlerse: resets
iç içe geçmiş ne için? İç içe geçmiş bir resets
örneği var mı?Scala'da iç içe sıfırlama örneği örneği
cevap
reset
Evet, iç içe olabilir ve evet, yararlı olabilir. Örnek olarak, GWT geliştiricilerinin doğrudan bir tarzda (Java için GWT'de kullanılan geri arama geçirme stilinin aksine) eşzamanlı olmayan RPC'leri (uzaktan yordam çağrıları) yazmasına olanak veren
scalagwt project için bir API'yi prototipledim. Örneğin:
field1 = "starting up..." // 1
field2 = "starting up..." // 2
async { // (reset)
val x = service.someAsyncMethod() // 3 (shift)
field1 = x // 5
async { // (reset)
val y = service.anotherAsyncMethod() // 6 (shift)
field2 = y // 8
}
field2 = "waiting..." // 7
}
field1 = "waiting..." // 4
Yorumlar, yürütme sırasını gösterir. Burada, async
yöntemi, bir reset
gerçekleştirir ve her servis çağrısı bir shift
gerçekleştirir (uygulamayı my github fork, özellikle Async.scala üzerinde görebilirsiniz).
Yuvalanmış async
denetim akışını nasıl değiştirdiğine dikkat edin. Bu olmadan, field2 = "waiting"
hattı, ikinci RPC'nin başarıyla tamamlanmasından sonra gerçekleştirilemez. RPC yapıldığında
, uygulama en iç async
sınır kadar devam yakalar ve RPC başarıyla tamamlanması üzerine yürütülmesi için askıya alır. Böylece, iç içe geçmiş async
bloğu, kontrolün ikinci RPC yapıldıktan hemen sonra hatta hemen akmasına izin verir. Bu iç içe geçmiş blok olmaksızın, devam, dış async
bloğunun sonuna kadar devam edecek, bu durumda dış async
içindeki tüm kodlar her bir RPC'de bloke olacaktır.
reset
, bir kodun, içindeki kodun devam sihriyle uygulandığı gerçeğinden etkilenmeyecek şekilde bir soyutlama oluşturur. Bu nedenle, sıfırlama ve kaydırma ile kod yazıyorsanız, sıfırlama ve kaydırma ile de uygulanabilecek veya uygulanmayabilecek başka kodları da çağırabilir. Bu anlamda iç içe olabilirler.