2012-10-07 12 views
10

Aşağıdaki yöntemi vardır:scala: (def) bir yöntem kullanılarak vs bir fonksiyonu (val) varsayılan parametreleri tanımlamak

scala> def method_with_default(x: String = "default") = {x + "!"} 
method_with_default: (x: String)java.lang.String 

scala> method_with_default() 
res5: java.lang.String = default! 

scala> method_with_default("value") 
res6: java.lang.String = value! 

Bir val ile aynı ulaşmak için çalışıyorum, ama olsun böyle sözdizimi hatası:

(varsayılan değeri ile, bu bir derler Tamam)

scala> val function_with_default = (x: String) => {x + "!"} 
function_with_default: String => java.lang.String = <function1> 

(ama alamadım derlemek için bu bir ...)

herhangi bir fikir?

cevap

5

Bunu yapmanın bir yolu yok. Elde edebileceğiniz en iyi şey, ve Function0 hem de Function0 uygulama yöntemini, diğer geçerli yöntemi varsayılan parametreyle çağırır. Eğer daha sık bu tür işlevleri gerekirse

val functionWithDefault = new Function1[String,String] with Function0[String] { 
    override def apply = apply("default") 
    override def apply(x:String) = x + "!" 
} 

, bir soyut sınıfın böyle DefaultFunction1 içine yöntemini uygulamak varsayılan çarpanlarına olabilir:

val functionWithDefault = new DefaultFunction1[String,String]("default") { 
    override def apply(x:String) = x + "!" 
} 

abstract class DefaultFunction1[-A,+B](default:A) 
       extends Function1[A,B] with Function0[B] { 
    override def apply = apply(default) 
} 
+0

Function0 ile function1 oldukça zeki olduğunu, ama bunun olduğunu söyleyebilirim biraz koklamak. Sadece benim fikrim burada. Tartışma yapılmadı. :) – pedrofurla

+1

BTW fonksiyonları için şekerleri kullanabilirsiniz: '(() => String ile yeni (String => String) {override def apply = Uygula (" varsayılan "); geçersiz kılmayı uygula (x: String) = x + "!" } 'işler. – pedrofurla

+0

Katılıyorum biraz kokuyor ama ben olmayan bir çözüm göremiyorum. –