2013-05-22 25 views
5

Tôi đang sử dụng đoạn mã sau để đáp ứng nhu cầu của tôi:Scala placeholder cởi ra tham số

(1 to 5)..map(i => s"\\x${i}") // Produces List("\\x1", "\\x2", "\\x3", "\\x4", "\\x5") 

Nhưng tôi muốn sử dụng một trình giữ chỗ. Theo the string interpolator documentation:

(1 to 5).map(s"\\x${_}") 

nên mở rộng ra:

(1 to 5).map(StringContext("\\\\x","").s(_)) 

Nhưng các tác phẩm thứ hai, không phải là cũ, mà ném một error: unbound placeholder parameter trên _. Tại sao?

Trả lời

10

Tôi tin với cú pháp:

(1 to 5).map(s"\\x${_}") 

Trình biên dịch tin rằng _ thuộc về s chức năng trong trường hợp này nó sẽ không hoạt động. Bạn có thể dễ dàng giải quyết điều này bằng cách làm một cái gì đó như thế này:

(1 to 5).map(i => s"\\x${i}") 

Bạn có thể muốn có một cái nhìn tại link này cho rõ ràng hơn về các quy tắc cho placeholders liên quan đến chức năng ẩn danh.

EDIT: Theo bài này, cú pháp giữ chỗ đã từng làm việc, vì vậy có lẽ đây là một lỗi hồi quy hoặc một tính năng mà chưa bao giờ có nghĩa là để làm việc theo cách này: https://groups.google.com/forum/#!msg/scala-internals/G_54LGj0zpg/REZfyXZ6-RwJ

+0

tôi đã thêm các giải pháp mà tôi đã đã sử dụng trực tiếp trong câu hỏi của tôi. Tôi muốn có nhiều hơn niềm tin nếu có thể. 's' không phải là một hàm, nó là một tính năng scala. –

+1

@ MikaëlMayer tốt, không, nó không phải là một tính năng ngôn ngữ. Nó được định nghĩa ở đây: http://www.scala-lang.org/api/current/#scala.StringContext Bạn cũng có thể sử dụng nguyên "", f "" hoặc thậm chí tạo các bộ nội suy chuỗi của riêng bạn (json "", sql "", ...) – VasyaNovikov

Các vấn đề liên quan