Một số trường hợp sử dụng ví dụ cho các ký tự ký hiệu trong Scala là gì?


93

Việc sử dụng các ký tự ký hiệu không rõ ràng ngay lập tức với những gì tôi đã đọc trên Scala. Có ai muốn chia sẻ một số cách sử dụng trong thế giới thực không?

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

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

Cảm ơn

Câu trả lời:


76

Theo thuật ngữ Java, các ký hiệu là các chuỗi đan xen. Điều này có nghĩa là, ví dụ, so sánh bình đẳng tham chiếu ( eqtrong Scala và ==trong Java) cho kết quả giống như so sánh bình đẳng thông thường ( ==trong Scala và equalstrong Java): 'abcd eq 'abcdsẽ trả về true, trong khi "abcd" eq "abcd"có thể không, tùy thuộc vào ý tưởng bất chợt của JVM (tốt, nó sẽ cho các chữ, nhưng không cho các chuỗi được tạo động nói chung).

Các ngôn ngữ khác sử dụng ký hiệu là Lisp (sử dụng 'abcdnhư Scala), Ruby ( :abcd), Erlang và Prolog ( abcd; chúng được gọi là nguyên tử thay vì ký hiệu).

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ó thuần túy 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 các đĩa CD, bao gồm một cột có tên "price", tôi không quan tâm đến việc ký tự thứ hai trong "price" là "r", hay về việc nối các tên cột; vì vậy một thư viện cơ sở dữ liệu trong Scala có thể sử dụng hợp lý các ký hiệu cho tên bảng và cột.


25
Có lẽ cần phải nhớ rằng == trong Scala thực hiện điều .equals, vì vậy thực sự sự khác biệt sẽ là khi sử dụng phương thức "eq" có 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 là cực kỳ rẻ.
Calum

@Calum, cũng như so sánh giữa hai chuỗi. Thực tập Java (nhiều hơn hoặc ít hơn) tất cả các chuỗi.
Elazar Leibovich,

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

1
@Elazar Không phải vậy, bởi vì các Biểu tượng có thể dựa vào giá trị của chúng được thực tập, trong khi với Chuỗi là tùy chọn và có thể tối ưu hóa một số trường hợp sử dụng. Các biểu tượng giống như Enums được tạo động hơn bất cứ thứ gì. Tôi đã giải thích chi tiết điều này trên câu trả lời mà tôi đã liên kết trong phản hồi cuối cùng của mình; vui lòng đọc nó để biết thêm.
Calum

3
Vì vậy, "xin chào, thế giới!" là tập hợp các ký tự tuần tự trong khi 'helloWorld là giá trị thân thiện với mọi người hơn là 14392.
CW Holeman II

26

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

Symbol Literal ra đời 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ó chỉ thực sự ở đó nơi bạn muốn chỉ ra, đây không chỉ là một số dữ liệu chuỗi, mà trên thực tế theo một cách nào đó là 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ó theo cách khác 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.

Liên kết này thảo luận về nó khá tốt.


1
Đây là lời giải thích hữu ích av. Nó khiến tôi nghĩ về lựa chọn thay thế để enums - có thể vụng về
javadba

2

Python chứa một bảng toàn cục nội bộ gồm "các chuỗi được xen kẽ " 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ể buộc quá trình này bằng internhàm ( sys.interntrong python3).

Ngoài ra, Java và Scala tự động sử dụng "chuỗi xen kẽ" để tìm kiếm nhanh hơn. Với scala, bạn có thể sử dụng internphương pháp để buộc người 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. Các biểu tượng được hưởng lợi từ việc đảm bảo được thực hiện, vì vậy một kiểm tra bình đẳng tham chiếu duy nhất vừa đủ để chứng minh bình đẳng hoặc bất bình đẳng.

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.