2013-09-30 31 views
9

Scala'da anonim bir işlev için varsayılan bir değer ayarlamaya çalışıyorum ve böylece herhangi bir çözüm bulamıyorum. Umarım birileri bana yardım eder.Scala'da işlev parametresi için varsayılan değeri ayarla

, aşağıdaki yapıya,

case class A(id:Int = 0) 

case class B(a:A) 

object B { 
    def func1(f:Int = 0)={ 
     ........ 
    } 
def func2(f:A => B = (how to give default value ?))={ 
     case Nothing => { 
     //do something.... 
     } 
     case _ => { 
     //do some other thing...... 
     } 
} 
} 

Temelde, isteğe bağlı olarak bir parametre geçen olmak için vardır. Bunu nasıl başarabilirim?

scala> def test(f: Int => Int = _ + 1) = f 
test: (f: Int => Int)Int => Int 

scala> test()(1) 
res3: Int = 2 

veya dize ile: Başka varsayılan parametre gibi

cevap

13

scala> def test(f: String => String = identity) = f 
test: (f: String => String)String => String 

scala> test() 
res1: String => String = <function1> 

scala> test()("Hello") 
res2: String = Hello 

Düzenleme: durumda

varsayılan olarak sağlanan bir işlevi kullanmak istiyorsanız, ()'u açıkça kullanmak zorundadır, ya Scala varsayılan bir argümanı yapıştırmaz. istediğini varsayılan işlevini kullanın ve açık bir tane girmezseniz

, sadece kendiniz sağlar:

scala> test(_.toUpperCase)("Hello") 
res2: String = HELLO 
+0

Bu cevabın soruyla nasıl bir ilişkisi olduğunu merak ediyorum, varsayılan parametrelerden ziyade, körlenmiş işlevlerin kullanımıyla ilgili gibi görünüyor mu? –

+0

@GyroGearless no, hatalısınız – 4lex1v

+0

Tamam, anladım. Ancak, örnek olarak, varsayılan olmayan örnek için bir örneğe sahip olsaydı, örneğinizin daha öğretici olacağını düşünüyorum. 'test (_ * 33) (1)' –

1

örtük bir parametresini kullanın. Nesnedeki parametre için örtülü bir değer yerleştirin. Açık bir parametre sağlamadıkça veya arama kapsamına başka bir örtülü değer sağladığınız sürece bu kullanılır.

case class A(id:Int = 0) 

case class B(a:A) 

object B { 
    implicit val defFunc: A => B = {a: A => new B(a) } 
    def func1(f:Int = 0)={ 
    } 
    def func2(implicit func: A => B) = { ... } 
} 

Bu yöntemde ve Alexlv yöntemi arasındaki farklar

Bu bağımsız fonksiyonları yanı sıra yöntemlerle çalışmaktadır
  1. bulunmaktadır.
  2. Kapsam kuralları, uygun kapsamlarda uygun geçersiz kılmaların sağlanmasına izin verir. Alex'in yöntemi, varsayılanı değiştirmek için alt sınıflandırma veya eta-genişletme (kısmi uygulama ile) gerektirir.

Zaten bir nesne kullandığınız için bu çözümü sunuyoruz. Aksi halde, Alexvlv'in örneği daha basittir.

+0

Func2 yönteminiz, kullanımı anlamında oldukça ılımlı. İki param listelerini alıp kısmi bir işlev döndürürsünüz, bu yüzden sonuç işlevini yerine getirmeye çalışırsanız bu beklediğiniz gibi olmaz, yani 'func2 (10)' (tümü _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _) bir hata atar çünkü 'func2' örtük bir param bekler ve siz bir int verdiniz. Size imalardan (bir yakınınızdaki bir tasarıma sahip) bir felaket olduğunda ve çok fazla parçalandığında, üretimden size tonlarca örnek verebilirim. – 4lex1v

+0

Doğru. Orijinal kodunu çoğunlukla olduğu gibi bırakmaya çalışarak kendimi engellemeye izin verdim. Akıl için düzenlenmiş. – itsbruce

İlgili konular