2012-10-31 12 views
6

çıkarım değildir Aşağıdaki yöntemini varScala uygun yöntemi

def show[E: Writes, T: Writes](block: RequestWithUser[AnyContent] => Either[E, T]): Action[AnyContent] = { 
    withErr(block) 
} 
Ben bir denetleyici bunun gibi kullanmak

:

def show(id: Long) = CrudAuthAction.show { request => 
    IdeaType.findByIdWithErr(id) 
} 

Ve istek yöntemi seçmeli olmak istiyorum, bu yüzden aynı yöntemle başka imza tanımlamıştır:

def show[E: Writes, T: Writes](block: => Either[E, T]): Action[AnyContent] = { 
    withErr(request => block) 
} 

Ve gayet iyi çalışıyor, ben istek param atlayabilirsiniz

Ama bu gibi kullanmak istediğinizde bu diğer yöntemle

def list[T: Writes](block: RequestWithUser[AnyContent] => T): Action[AnyContent] = { 
    fromRequest(block) 
} 

def list[T: Writes](block: => T): Action[AnyContent] = { 
    fromRequest(request => block) 
} 

ile aynı şeyi yapmaya çalıştıklarında:

def list = CrudAuthAction.list { request => 
    IdeaType.find(request.queryString) 
} 

o, o istek parametresi türü yok söylüyor ve Bunu şu şekilde belirtmeliyim:

def list = CrudAuthAction.list { request: RequestWithUser[AnyContent] => 

İlk durumdan neyin farklı olduğunu görmüyorum ama Bir ... isteğinin uygun türünü tahmin etmek

gördüğüm tek fark birinci durumda, blok bir Ya [E, T] dönüyor, ancak ikinci durumda dönen olmasıdır görünmüyor olabilir sadece genel bir T ...

+2

En az tekrarlanabilir örnek gerekiyor. IdeaType.find, CrudAuthAction vb. Tanımına dayanır. – themel

+1

@themel: Tam bir örnek göndermenin gerekli olduğunu düşünmüyorum, özellikle de problem burada olduğu gibi açıkça ve ayrıntılı olarak açıklanıyorsa. –

cevap

5

Sorun, ikinci örnekte, derleyicinin hangi aşırı yüklenme yöntemini kullanacağını bilmemesidir, çünkü T bir işlev türü olabilir. Either açıkça bir işlev olmadığı için, ilk durumda çalışır. Foo böyle tanımlanan sayesinde bu sorunu çözmek için

, sen

def list[T: Writes](block: => Foo[T]): Action[AnyContent] = { 
    fromRequest(request => block.v) 
} 

ikinci yöntemini değiştirmek olabilir:

case class Foo[T](val v:T) 

Maalesef Foo bir örtük dönüştürme şeyleri tekrar kırar ekleyerek sürece Writes tür sınıfındaki her tür için örtülü bir dönüşüm oluşturursunuz.

+0

Seni takip edip edemeyeceğimi göreyim. Yani bu durumda blok: => T, {request => ...} gibi bir parametre alan bir işlevle eşleşebilir, bu yüzden derleyiciye daha fazla ipucu vermeliyim ... – opensas

+0

no tüm derleyici için, T bir fonksiyon tipi olabilir. –