2010-03-20 39 views
11

Đây không chỉ là một quip nhàn rỗi ... Tôi tự hỏi nếu có ai biết nếu có một lý do thiết kế thực tế tại sao Scala không hỗ trợ nội suy tương tự như Groovy và "Javas cú pháp tốt hơn"?Tại sao không có nội suy chuỗi trong Scala?

ví dụ:

 
var str1 = "World"; 
var str2 = "Hello, ${str1}"; 
+0

Câu hỏi này cũng tương tự như http://stackoverflow.com/ câu hỏi/2183503/thay thế-giá trị-in-a-string-với-placeholders-in-scala/2189134 với nhiều câu trả lời khác nhau. –

+0

@Mitch: Nó thực sự không phải là cùng một câu hỏi. Người hỏi khác muốn biết làm thế nào để làm điều đó; Tôi muốn biết lý do đằng sau quyết định của các nhà thiết kế Scala, được trả lời dưới đây. –

+1

Hiện tại có (Nội suy chuỗi Scala 2.10): 's" Xin chào, $ str1 "' (http://docs.scala-lang.org/overviews/core/string-interpolation.html) –

Trả lời

16

Giải pháp được đề xuất là bỏ qua khoảng trống khi sử dụng +.

"a="+a+", b="+b 

Đã suggested rằng một bố trí bàn phím của Thụy Sĩ làm cho điều này rất tự nhiên để gõ, vì vậy những người sáng tạo của Scala không cảm thấy đủ đau để biện minh phức tạp langauge theo hướng này :)

+1

Lúc đầu, tôi nghĩ rằng "bàn phím Thụy Sĩ" điều là một trò đùa, nhưng sau khi đọc bài báo liên kết tôi quyết định chọn này là câu trả lời tốt nhất! Cảm ơn bạn đã đến với trung tâm câu hỏi của tôi, đó là "TẠI SAO ??" là tính năng này thiếu từ Scala. –

+10

OMG điều này thật khủng khiếp. –

7

Nó được coi là trình biên dịch phức tạp thêm rằng sẽ là kết quả của nó là không có giá trị lợi nhuận để có được một mặt, và, mặt khác, đó là sự vắng mặt của nó sẽ không quá nặng nề.

1

Scala không có một tính năng tương tự cho XML:

val x = doSomeCrazyCalculation 
val xml = <foo>{x}</foo> 
7

tôi thu thập cảm giác là chuỗi suy là không cần thiết, bởi vì nó không phải là nhiều hơn nữa súc tích hơn nối:

val str2 = "Hello, ${str1}!" 
val str2 = "Hello, "+str1+"!" 

Lập luận rằng các Toán tử "+" trên Chuỗi phải được định dạng mà không có khoảng trắng, Martin Odersky says,

Với quy ước mới, nhu cầu thay thế chuỗi (thường là đưa ra trên danh sách Scala) tất cả nhưng biến mất. So sánh:

"test results: ${result1}, ${result2}" 

với phiên bản đầu tiên ở trên. Bạn đã lưu một ký tự cho mỗi thay thế , hầu như không đáng để có quy ước cú pháp mới. Nói cách khác, cú pháp thay thế chuỗi Scala được viết

"+...+" 

thay vì

${...} 

hoặc một số đề nghị tương tự khác. Mặt khác, nếu bạn nhấn mạnh vào các không gian xung quanh dấu +, câu chuyện trở nên kém thuyết phục hơn nhiều.

Ngẫu nhiên, hãy xem bài đăng trên blog, "String Interpolation in Scala" nơi được mô phỏng bằng phản chiếu.

+1

Daniel (người đã cho người đầu tiên câu trả lời ở đây và dường như quá khiêm tốn để quảng bá nó) cũng đã tạo ra một giải pháp, cũng như (http://dcsobral.blogspot.com/2010/01/string-interpolation-in-scala-with.html). Lưu ý rằng nó yêu cầu một bản phát hành sau Scala 2.8.0.Beta1. –

+2

Họ có một điểm tốt ... nó chỉ là 4 ký tự so với 3. Điều gì sẽ là tốt đẹp là một sửa đổi IDE Eclipse để làm nổi bật "+ ... +" khác với khởi đầu/kết thúc bình thường của chuỗi! –

+8

Tôi không nghĩ rằng so sánh là hợp lệ trong trường hợp chung. Nếu bạn cần phải nội suy một biểu thức, so sánh phải là: '" 1 + 1 = \ {1 + 1}! "' (13 ký tự) so với '" 1 + 1 = "+ (1 + 1) +"! " '(16 ký tự) –

7

Bắt đầu từ Scala 2.10.0, Scala không support String Interpolation

Ví dụ:

val name = "James" 
println(s"Hello, $name") // Hello, James 
Các vấn đề liên quan