2011-03-10 28 views
12

Birisi bana tam olarak burada neler olduğunu açıklayabilir mi? Tamamen şu anda içine almıyorum: Adlandırılmış Argümanlar'da Alt Çizgi

val s = Seq(1D,2D,3D,4D) 
case class WithUnit(value: Double, unit: String) 
s map { WithUnit(_,"cm") } // works 
s map { WithUnit(value = _ , unit = "cm") } // error: missing parameter type for expanded function ((x$2) => value = x$2) 

Ben argüman adını yazdığı için derleyici parametre türünü tahmin veremeyiz sanırım. Ama neden olmasın? Sadece argümanın ismini açıklamaktan daha zor olmamalı ?!

Teşekkürler!

cevap

27

sen yazdığında:

WithUnit(value = _, unit = "cm") 

Yani bunu gördük:

x => WithUnit(value = x, unit = "cm") 

Ama hata mesajı yakından bakmak bile, derleyici vermedi olduğunu göreceksiniz _ daha sıkı istediğini daha kapsama aldığı, Gördüğünüz gibi

WithUnit(x => value = x, unit = "cm"}) 

: o olarak çözümlenen, bu şekilde görüyoruz.

_ Her zaman en dar ve dejenere olmayan kapsamı seçer. Kapsam, türlere bakılmaksızın ayrıştırma sırasında tamamen sözdizimsel olarak belirlenir. dejenere By

, ben demek istediğini düşünüyorum derleyici yaptığı anlamına:

WithUnit(value = x => x, unit = "cm") 

dar olmayan dejenere kapsam alt çizgi ile en içteki işlevi parantez akrabası tarafından tanımlanan kapsamını ifade eder. Böyle bir kural olmaksızın, derleyici, işlev çağrıları iç içe geçtiğinde hangi işleve karşılık geleceğini bilemez.

+1

Ahh, anladım! Şimdi daha derin bir anlayışa sahibim .... _testest olmayan dejenere olan scope_ ... Bunu hatırlayacağım! Teşekkür ederim! –

+1

Belki de, bu bir hatadır. 'WithUnit (_," cm ")', kısmi işlevli bir literal olarak değil, kısmen uygulanmış bir işlev olarak ele alındığı için çalıştı. Adlandırılmış parametrelerle kullanıldığında aynı şekilde ele alınmıyor, ki bu sadece bir gözetim olduğundan şüpheleniyor. –

+1

@Daniel: "Kısmen uygulanan işlev" ile "anonim işlev değişmezi" arasında çizim yaptığınız ayrımı düşünmüyorum. –

3

Bu deneyin:

scala> val withUnits = s map { x => WithUnit(value = x, unit = "cm") } 
withUnits: Seq[WithUnit] = List(WithUnit(1.0,cm), WithUnit(2.0,cm), WithUnit(3.0,cm), WithUnit(4.0,cm)) 

sorun doğrudan anynymous işlev tanımlamak için çizgi kullanılmasıdır.

chapter 8.5. Placeholder syntax in the "Programming in Scala" book'da ayrıntılı bir açıklama bulunmaktadır.

+0

Link için teşekkür ederiz, bazen İncil'i kontrol etmeyi unutuyorsunuz;) –

İlgili konular