Ben bir ağ çağrı başarısız olursa yeniden deneme kolaylaştırmak için kullanılan bir özyinelemeli fonksiyon çağrısı var, aşağıda yer snippet'ine (Amazon SimpleDB bazen 503 dönmek ve yeniden deneme gerektirecektir.)Scala neden özyinelemeli işlevler için bir dönüş türü gerektiriyor? kodunda
Ben derlemeye çalıştığınızda Scala recursive method simpledb_update needs result type
'dan şikayet ediyor.
// sends data to SimpleDB. Retries if necessary
def simpledb_update(name: String, metadata: Map[String,String], attempt: Int) = {
try {
db(config("simpledb_db")) += (name, metadata)
} catch {
case e =>
// if it fails, try again up to 5 times
if(attempt < 6)
{
Thread.sleep(500)
simpledb_update(name, metadata, attempt + 1)
} else
AUlog(name + ": SimpleDB Failed")
}
}
Bu neden yineleme işlevleri için gereklidir? Benim düşüncem, derleyiciyi tatmin etmek için doğru/yanlış bir boole döndürmek ... aşağıdakileri derler.
// sends data to SimpleDB. Retries if necessary
def simpledb_update(name: String, metadata: Map[String,String], attempt: Int): Boolean = {
try {
db(config("simpledb_db")) += (name, metadata)
true
} catch {
case e =>
// if it fails, try again up to 5 times
if(attempt < 6)
{
Thread.sleep(500)
simpledb_update(name, metadata, attempt + 1)
} else
AUlog(name + ": SimpleDB Failed")
false
}
}
Benzer: http://stackoverflow.com/questions/2209179/type-inference-on-method-return-type – missingfaktor
Psst, eğer 2.8 kullanıyorsanız, 'try: Int = 0' kullanın, böylece orijinal çağrınız yapmaz ' t sıfır girişimi olduğunu belirtmem gerekiyor! Ayrıca, derinlemesine tekrarlayan bir şey yaparsanız, yığının taşmasına neden olabilirsiniz (6, elbette iyidir). Scala'nın yığını kullanmamasını kontrol edip edemediğini kontrol etmek için, 'def' yerine '@ annotation.tailrec 'ile not ekleyin. Kuyruk özyinelemeli değilse, yığın kullanılmalı ve Scala bir hata atar - en azından ek açıklamaları kaldırdığınızda ne ile uğraştığınızı bilirsiniz. –
Ruby'den geliyor, bu benim ilk eğilimimdi. Ne yazık ki, 2.7'de ... desteksizim! Yükseltme zamanı, sanırım. – Joshua