Scala underscore - ERROR: tipe parameter tidak ada untuk fungsi yang diperluas

88

Saya tahu ada beberapa pertanyaan tentang ini, tetapi saya telah membuat contoh sederhana yang menurut saya harus berfungsi, tetapi masih tidak dan saya tidak yakin saya mengerti mengapa

val myStrings = new Array[String](3)
// do some string initialization

// this works
myStrings.foreach(println(_))


// ERROR: missing parameter type for expanded function
myStrings.foreach(println(_.toString))

Adakah yang bisa menjelaskan mengapa pernyataan kedua tidak dapat dikompilasi?

Jeff Storey
sumber
4
Lebih sederhana lagi:myStrings.foreach (println)
pengguna tidak diketahui

Jawaban:

120

Ini berkembang menjadi:

myStrings.foreach(println(x => x.toString))

Kamu ingin:

myStrings.foreach(x => println(x.toString))

Sintaks placeholder untuk fungsi anonim menggantikan ekspresi berisi sekecil mungkin dengan sebuah fungsi.

retronim
sumber
Mengapa myStrings.foreach(println(_))secara otomatis menyertakan toStringargumen ke println?
Kevin Meredith
1
@Kevi Meredith println memanggil toString () dari objek mana pun yang dilewatkan
krookedking
1
The sintaks Pengganti untuk fungsi anonim menggantikan mungkin ekspresi yang mengandung terkecil dengan fungsi. membantu saya dengan keraguan yang saya ungkapkan dalam pertanyaan ini: stackoverflow.com/questions/37589210/…
GA1