2012-01-04 18 views
6

Sürekli olarak scalaya girdiğim bir problem, lambda 'ifadeleridir. Örneğin_ (alt çizgi) kullanılırken "Genişletilmiş işlev için eksik parametre türü"?

JarBuilder.findContainingJar(clazz).foreach {userJars = userJars + _ } 

bana gibi bir hata veriyor:

missing parameter type for expanded function ((x$1) => userJars.$plus(x$1)) 

Yine de genişleme kendim yaparsam:

JarBuilder.findContainingJar(clazz).foreach {x => userJars = userJars + x } 

iyi çalışır.

Bu bir Scala hatası mı? Yoksa korkunç bir şey mi yapıyorum?

+1

'_' düşünebilirsiniz ne Ancak gerçekleştirmek için çalışıyoruz Verilen. Bu bağlamda * özel * sembolüdür: * herhangi bir basit tanımlayıcının iyi çalışması gerekir *. Bu sihirden dolayı, '' '(4) .foreach (_ +: List())' ''' iyi çalışıyor ''. Görmek için, '' (4) .map (_ + 1) 've' Some (4) .map (x => x + 1) 'seçeneklerini karşılaştırın. Umarım bu bir kopyasıdır (ve böyle kapalı) ya da SLS'den gelen güzel bir cevap olacaktır :) –

+1

http://stackoverflow.com/questions/7695270/underscore-in-list-filter (iyi), http : //stackoverflow.com/questions/4422016/scala-underscore-minimal-function, http://stackoverflow.com/questions/6593277/concise-notation-for-single-arg-anonymous-function-avoiding-underscore-not -korku –

+0

(Aslında, * herhangi bir * bağlamı var mı diye merak ediyorum * _ * * * farklı bir şekilde büyülü *)) –

cevap

6

İsimsiz işlevler için yer tutucu sözdiziminin kullanımı ifadeleriyle sınırlıdır. Kodunuzda joker karakteri, bir ifade ile aynı olmayan bir atama deyiminde kullanmaya çalışırsınız.

Hataya yakından bakarsanız, öbeğinizin sağ tarafındaki ifadenin, anonim bir işleve genişletildiğini görebilirsiniz.

Eğer orada anlamı ne düşündüğünü anlamına gelmez aşağıdaki

userJars = userJars ++ JarBuilder.findContainingJar(clazz) 
+0

Teşekkürler, mantıklı. Her ne kadar ++ çözümünüz işe yaramıyorsa, "findContainJar" bir Seçeneği döndürdüğü için [T] bir liste değil [T] – Heptic

+0

Bir seçenek gerektiğinde örtük olarak bir tekrarlanabilir duruma getirilmelidir. Bu 2.9.0.1'de çalışıyor gibi görünüyor. –

İlgili konular