Dấu gạch dưới Scala - LỖI: thiếu loại tham số cho hàm mở rộng


88

Tôi biết đã có khá nhiều câu hỏi về vấn đề này, nhưng tôi đã tạo một ví dụ đơn giản mà tôi nghĩ nên hoạt động, nhưng vẫn không và tôi không chắc mình hiểu tại sao

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))

Ai đó có thể giải thích tại sao câu lệnh thứ hai không biên dịch?


4
Đơn giản hơn nữa:myStrings.foreach (println)
người dùng không xác định

Câu trả lời:


120

Nó mở rộng thành:

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

Bạn muốn:

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

Cú pháp trình giữ chỗ cho các hàm ẩn danh thay thế biểu thức chứa nhỏ nhất có thể bằng một hàm.



Tại sao myStrings.foreach(println(_))tự động bao gồm toStringcho đối số println?
Kevin Meredith

1
@Kevi Meredith println gọi toString () của đối tượng nào được thông qua
krookedking

1
Các cú pháp các placeholder cho các chức năng vô danh thay thế biểu thức chứa nhỏ nhất có thể với một hàm. đã giúp tôi giải đáp những nghi ngờ mà tôi đã bày tỏ trong câu hỏi này: stackoverflow.com/questions/37589210/…
GA1
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.