2012-08-13 15 views
13

iade ifade ile ilgili sorunlar: Sadece return ifadesini eklersenizscala: Bu</p> <p>Aşağıdaki kod Tamam derler wth biraz şaşkınım

def save: Action[AnyContent] = Action { 
    if (1 == 2) { 
    BadRequest(toJson("something went wrong")) 
    } else { 
    Ok(toJson(Feature.find)) 
    } 
} 

ama, ben şu olsun:

def save: Action[AnyContent] = Action { 
    if (1 == 2) { 
    return BadRequest(toJson("something went wrong")) 
    } else { 
    return Ok(toJson(Feature.find)) 
    } 
} 

[error] found : play.api.mvc.SimpleResult[play.api.libs.json.JsValue] 
[error] required: play.api.mvc.Action[play.api.mvc.AnyContent] 
[error]  return BadRequest(toJson("something went wrong")) 

Ben

BTW

, Eylem ile, bir refakatçi nesnesidir ... Bu iki kod eşdeğer olacağını düşündüm formun bir işlevini alan bir başvuru yöntemi: Request [AnyContent] => Sonuç ve bir Action [AnyContent] döndüren bir Eylem [AnyContent]

Geri dönüş deyimiyle olduğu gibi, blok doğrudan BadRequest yürütme sonucunu döndürüyor gibi görünüyor. .. ve Tamam ... bloğun Action nesnesine aktarılmasının sonucunu döndürmek yerine ...

Doğru muyum?

Not: Ben

ps kadar çok iç içe harita ve getOrElse kurtulmanın bir yolunu bulmaya çalışıyorum: ... soru biraz şaşırtmak ise üzgünüm, kendimi kafam karıştı

cevap

11

Bu iki ifade gerçekten çok farklı şeyler yapar! İşte

def save: Action[AnyContent] = Action { 
    if (1 == 2) { 
    BadRequest(toJson("something went wrong")) 
    } else { 
    Ok(toJson(Feature.find)) 
    } 
} 

, save Action(Ok(toJson(Feature.find))) sonucunu döndürecektir. Şimdi, burada durum daha karmaşıktır. return Ok(toJson(Feature.find)) değerlendirildiğinde, save'dan dönecektir! Yani, Ok(toJson(Feature.find)) Action'a geçirilecektir. Bunun yerine, save yönteminin yürütülmesi durdurulacak ve Ok(toJson(Feature.find)) sonucu olarak geri dönecektir - bunun, bu tür bir save türünün döndürülmesi dışında olması gerektiğinden, bir tür hatası verir.

Unutmayın: return, def ürünle ilgili döndürür.

+0

teşekkürler daniel, zor yoldan ne dediğinizi keşfettim ... bir fonksiyondan koşulsuz bir çıkışa sahip olmanın aynı yolu var mı? Yani, dönüş işleminin eyleme geçirilen blokta değerlendirilmesini istiyorum… – opensas

+2

@opensas Fonksiyonunuzu her zaman bir 'def' olarak tanımlayabilir ve daha sonra 'Action' olarak parametre olarak iletebilirsiniz. –

+0

** Unutmayın: İade arızasının dönüşü **, bunun ne anlama geldiğini açıklayabilir misiniz? –

4
kullanmak

yöntem aslında Action refakatçi nesnesinde tanımlanır, ancak daha ziyade senin soru açıklayan bir, ama değil:

def apply (block: ⇒ Result): Action[AnyContent] 

argüman (block) tipi sonucu bir ifadesi, bu olur ise lat değerlendirilmek talep üzerine (isim tespiti). Bu bir işlev ya da kapanış değil, sadece bir ifade. Yani bir ifadeden return yapamazsınız.

BTW: Scala'da return kodunu kullanmak bir kokudur ve kaçınılmalıdır.

+0

Fonksiyonlar ve ifadeler arasındaki fark hakkında hiçbir fikrim yoktu, bunun için google'ım ... BTW, belki de bu soruyla bana yardımcı olabilirsiniz, işte bu her şeyi başlattı: http://stackoverflow.com/ sorular/11929235/scala-tarzı-nasıl-kaçınma-sürü-of-of-of-of-yuva-haritası – opensas

+1

@opensas Kontrol etmeniz gereken fark "fonksiyon" vs "isim-ismi argüman" dir. Bir isim-by-ismi '=>' ile başlar. – paradigmatic

+2

@paradigmatic Demek ki, "dönüş", "Eylem" tarafından beklenen türden ziyade "yöntem" ("Eylem" türü "türünü" kaydet) türünde bir değer gerektirir. ("Sonuç" yazın veya derleyici "SimpleResult" olarak raporlanır). Ya da, başka bir deyişle, "bir ifadeden" geri dönemezsiniz ", ancak bir yöntemden geri dönebilirsiniz (ve derleyici). Mantıklı, teşekkürler. –

İlgili konular