2016-04-01 27 views
1

aşağıdaki Scala hakkında bilgi edinme ve şaşkın:Scala xs.foreach (verim _)?

bu varsayalım: val filesHere = (new java.io.File(".")).listFiles

Bu çalışır: for (fn <- filesHere) yield fn

Bu çalışır: filesHere.foreach(println _)

Bu işe yaramazsa: filesHere.foreach(yield _)

Hata iletisi: <console>:1: error: illegal start of simple expression

Neden son bir çalışma ve nasıl çalışacaksınız foreach?

+0

Dosyalarla ne yapmaya çalışıyorsunuz? Her dosyada aynı eylemi gerçekleştirmeye çalışıyorsanız, basit bir 'harita' daha iyi bir seçim olacaktır. '(') Için verim {...} 'sözdizimi, bir dizi' flatma 'operasyonu için bir son şeklin izlediği şekildedir (' verim '). Daha fazla açıklama için belgelere bir [link] (http://docs.scala-lang.org/tutorials/FAQ/yield.html) gönderilir. – Eric

cevap

3

yield, yalnızca örnek kodunuzda for dersleri, yani for (fn <- filesHere) yield fn ile birlikte kullanılan bir anahtar sözcüktür. Bu, filesHere üzerinden yinelenecek ve her öğeyi yield fn aracılığıyla döndürecektir.

ardından değeri result-fn elemanlarının elde edilen toplama atamak aşağıdaki gibidir:

val result = for (fn <- filesHere) yield fn 

for (fn <- filesHere) yield fnfilesHere.map(fn => fn) eşdeğerdir.

filesHere.foreach(fn => fn)for (fn <- filesHere) fn eşdeğer olacaktır (hayır yield anahtar kelime ve dolayısıyla hiçbir sonuç eleman senin durumunda yararlı bir şey yapmazdım anlamına gelen döndü yani Bütünlüğü için

. filesHere.foreach(println _) eşdeğerdir şey fazlasını yapar filesHere.foreach(fn => println(fn)) için Standart çıktıya println aracılığıyla yazdırılarak yararlıdır.

Bunu biraz açıklığa kavuşturalım :).