2009-04-23 15 views
79

Việc sử dụng các ký hiệu chữ không rõ ràng ngay từ những gì tôi đã đọc trên Scala. Có ai quan tâm để chia sẻ một số sử dụng thực tế?Một số trường hợp sử dụng ví dụ cho các ký hiệu chữ cái trong Scala là gì?

Có một thành ngữ Java cụ thể nào được bao phủ bởi các ký hiệu chữ không? Ngôn ngữ nào có cấu trúc tương tự? Tôi đến từ một nền Python và không chắc chắn có bất cứ điều gì tương tự trong ngôn ngữ đó.

Điều gì sẽ thúc đẩy tôi sử dụng 'HelloWorld vs "HelloWorld"?

Cảm ơn

Trả lời

62

Trong thuật ngữ Java, ký hiệu là chuỗi nội bộ. Điều này có nghĩa, ví dụ, rằng so sánh bình đẳng tham khảo (eq trong Scala và == trong Java) cho kết quả tương tự như so sánh bình đẳng bình thường (== trong Scala và equals trong Java): 'abcd eq 'abcd sẽ trở thành sự thật, trong khi "abcd" eq "abcd" có thể không, tùy thuộc vào JVM whims (tốt, nó nên cho literals, nhưng không cho dây tạo ra động nói chung).

ngôn ngữ khác mà sử dụng những biểu tượng là Lisp (trong đó sử dụng 'abcd như Scala), Ruby (:abcd), Erlang và Prolog (abcd; chúng được gọi là các nguyên tử thay vì các biểu tượng).

Tôi sẽ sử dụng một biểu tượng khi tôi không quan tâm đến cấu trúc của một chuỗi và sử dụng nó hoàn toàn như một cái tên cho một cái gì đó. Ví dụ, nếu tôi có một bảng cơ sở dữ liệu đại diện cho đĩa CD, trong đó bao gồm một cột có tên là "price", tôi không quan tâm rằng ký tự thứ hai trong "price" là "r", hoặc về các tên cột nối; do đó, một thư viện cơ sở dữ liệu trong Scala có thể sử dụng hợp lý các biểu tượng cho các tên bảng và cột.

+22

Nó có thể đáng nhớ rằng == trong Scala hiện.bằng điều, do đó, thực sự sự khác biệt sẽ được khi sử dụng phương pháp "eq" mà tham chiếu bình đẳng. Tuy nhiên, một phần thưởng là so sánh giữa các biểu tượng cực kỳ rẻ. – Calum

+0

@Calum, như là so sánh giữa hai chuỗi. Java thực tập (nhiều hơn hoặc ít hơn) tất cả các chuỗi. –

+4

@Elazar: Điều đó có thực sự đúng không? Tôi đã ấn tượng rằng Java chỉ tập trung vào các chữ (nghĩa là gần như tất cả các chuỗi trong các ví dụ tầm thường, và hầu như không có chuỗi trong phần mềm sản xuất). Có nói rằng các trường hợp sử dụng các ký hiệu thường là giá trị theo nghĩa đen (tôi nghi ngờ bạn thường xây dựng chúng từ đầu), do đó, cho rằng lợi thế chính bạn nhận được chỉ là một kiểu mô tả hơn. – Calum

24

Nếu bạn có các chuỗi đồng bằng đại diện nói tên phương pháp trong mã, rằng có lẽ có được thông qua xung quanh, bạn đang không hoàn toàn truyền đạt điều thích hợp. Đây là loại vấn đề ranh giới Dữ liệu/Mã, không phải lúc nào cũng dễ dàng để vẽ đường, nhưng nếu chúng ta nói rằng trong ví dụ đó, tên phương thức có nhiều mã hơn là dữ liệu, thì chúng ta muốn một cái gì đó xác định rõ ràng rằng .

Ký hiệu Literal đi vào hoạt động khi nó phân biệt rõ ràng bất kỳ dữ liệu chuỗi cũ nào với cấu trúc đang được sử dụng trong mã. Nó thực sự ở đó, nơi bạn muốn chỉ ra, đây không chỉ là một số dữ liệu chuỗi, nhưng trên thực tế trong một số cách một phần của mã. Ý tưởng là những thứ như IDE của bạn sẽ làm nổi bật nó một cách khác nhau, và với công cụ, bạn có thể cấu trúc lại trên những thứ đó, thay vì thực hiện tìm kiếm/thay thế văn bản.

Điều này link thảo luận khá tốt.

+1

Đây là phần giải thích hữu ích. Nó làm cho tôi suy nghĩ về các lựa chọn thay thế cho enums - có thể vụng về – javadba

1

Python mantains bảng nội bộ toàn cục là "chuỗi nội bộ" với tên của tất cả các biến, hàm, mô-đun, v.v. Với bảng này, trình thông dịch có thể thực hiện tìm kiếm và tối ưu hóa nhanh hơn. Bạn có thể bắt buộc quá trình này với hàm intern (sys.intern trong python3).

Ngoài ra, Java và Scala sẽ tự động sử dụng "chuỗi nội bộ" để tìm kiếm nhanh hơn. Với scala, bạn có thể sử dụng phương thức intern để buộc thực tập của một chuỗi, nhưng quá trình này không hoạt động với tất cả các chuỗi. Biểu tượng được hưởng lợi từ việc được đảm bảo để được tập trung, do đó, một kiểm tra bình đẳng tham chiếu duy nhất là vừa đủ để chứng minh sự bình đẳng hoặc bất bình đẳng.