thể trùng lặp:
What are some example use cases for symbol literals in Scala?Mục đích của biểu tượng Scala?
mục đích của Symbol là gì và tại sao nó xứng đáng một số đặc biệt đen cú pháp e. g. 'FooSymbol
?
thể trùng lặp:
What are some example use cases for symbol literals in Scala?Mục đích của biểu tượng Scala?
mục đích của Symbol là gì và tại sao nó xứng đáng một số đặc biệt đen cú pháp e. g. 'FooSymbol
?
Ký hiệu được sử dụng trong đó bạn có bộ mã định danh kín mà bạn muốn có thể so sánh nhanh. Khi bạn có hai trường hợp String
, chúng không được đảm bảo để được thực tập [1], vì vậy để so sánh chúng, bạn thường phải kiểm tra nội dung của chúng bằng cách so sánh độ dài và thậm chí kiểm tra từng ký tự cho dù chúng có giống nhau hay không. Với Symbol
trường hợp, so sánh là một kiểm tra đơn giản eq
(ví dụ: ==
trong Java), vì vậy chúng là thời gian cố định (tức là O (1)) để tra cứu.
Loại cấu trúc này có xu hướng được sử dụng nhiều hơn trong ngôn ngữ động (đáng chú ý là mã Ruby và Lisp có xu hướng sử dụng nhiều ký hiệu) vì ngôn ngữ được gõ tĩnh thường muốn hạn chế bộ mục theo loại. Có nói rằng, nếu bạn có một kho khóa/giá trị trong đó có một tập hợp khóa bị hạn chế, nơi mà nó sẽ không sử dụng được để sử dụng đối tượng đã nhập tĩnh, cấu trúc kiểu Map[Symbol, Data]
cũng có thể tốt cho bạn .
Lưu ý về String
thực tập trên Java (và do đó Scala): Java String
s được thực hiện trong một số trường hợp; trong các chuỗi ký tự chuỗi cụ thể được tự động interned, và bạn có thể gọi phương thức intern()
trên một cá thể String
để trả về một bản sao được thực tập. Tuy nhiên, không phải tất cả các String
đều được tập trung, có nghĩa là thời gian chạy vẫn phải thực hiện kiểm tra toàn bộ trừ khi chúng là cùng một cá thể; interning làm cho việc so sánh hai chuỗi nội bộ bằng nhau nhanh hơn, nhưng không cải thiện thời gian chạy so sánh các chuỗi khác nhau.Lợi ích của Symbol
s được bảo đảm được bảo đảm để được thực tập, vì vậy trong trường hợp này, một kiểm tra bình đẳng tham chiếu duy nhất đủ để chứng minh sự bình đẳng hoặc bất bình đẳng.
[1] Thực tập là một quá trình theo đó khi bạn tạo một đối tượng, bạn kiểm tra xem liệu một đối tượng đã tồn tại chưa, và sử dụng nó nếu có. Nó có nghĩa là nếu bạn có hai đối tượng bằng nhau, chúng chính xác là cùng một đối tượng (nghĩa là chúng là tham chiếu bằng nhau). Nhược điểm của việc này là bạn có thể tốn kém để tra cứu đối tượng nào bạn cần sử dụng và cho phép các đối tượng được thu thập rác có thể yêu cầu triển khai phức tạp.
Symbol
s được thực tập.
Mục đích là Symbol
có hiệu quả hơn String
s và Symbol
s có cùng tên được giới thiệu đến cùng một đối tượng Symbol
(vì vậy có hashcode cùng).
Hãy nhìn vào đọc này về những biểu tượng Ruby: http://glu.ttono.us/articles/2005/08/19/understanding-ruby-symbols
Bạn chỉ có thể có được tên của một Symbol
:
scala> val aSymbol = 'thisIsASymbol
aSymbol: Symbol = 'thisIsASymbol
scala> assert("thisIsASymbol" == aSymbol.name)
Đúng, trong NET CLR, quá. –
Mục nhập này hơi gây hiểu nhầm; nơi bạn nói "có cùng mã băm", tất cả các chuỗi bằng nhau đều có cùng mã băm. Nơi chúng khác nhau là chúng chính xác là cùng một cá thể đối tượng, có nghĩa là so sánh chúng không liên quan đến việc gọi một phương thức "bằng" phức tạp mà sẽ so sánh mọi ký tự; bạn chỉ cần so sánh các vị trí bộ nhớ (tức là == trong Java hoặc "eq" trong Scala). IttayD: Điều đó không đúng; các chuỗi ký tự được thực tập và bạn có thể thực hiện các chuỗi ký tự bằng String.intern(). – Calum
Chuỗi không phải là 100% luôn được tập trung http://javatechniques.com/public/java/docs/basics/string-equality.html –
Đó là không phải là rất hữu ích trong việc Scala và do đó không được sử dụng rộng rãi. Nói chung, bạn có thể sử dụng một biểu tượng mà bạn muốn chỉ định một số nhận dạng.
Ví dụ: tính năng gọi phản chiếu được lên kế hoạch cho 2.8.0 sử dụng cú pháp obj o 'method(arg1, arg2)
trong đó 'o' là phương thức được thêm vào Bất kỳ và Biểu tượng đã được thêm vào phương thức áp dụng (Any *) (cả hai đều có 'pimp my library ').
Ví dụ khác có thể là nếu bạn muốn tạo một cách dễ dàng hơn để tạo tài liệu HTML, sau đó thay vì sử dụng "div" để chỉ định phần tử bạn muốn viết 'div. Sau đó, người ta có thể tưởng tượng thêm các toán tử vào Symbol để tạo đường cú pháp để tạo các phần tử
Ví dụ cuối cùng, không có lý do gì để không sử dụng chuỗi thay vì Biểu tượng. –
Lý do là trong HTML 'div' là một định danh, không chỉ là một chuỗi ngẫu nhiên. Đó là lý do tại sao tôi đã đề cập đến HTML và không phải XML (trong đó một phần tử có thể là bất kỳ tên nào). Vì vậy, lý do của Symbol là ngữ nghĩa. Nói một cách chức năng, không có sự khác biệt – IttayD
@IttayD, ad.HTML, biểu tượng hoặc chuỗi, nó không quan trọng bởi vì bạn có thể làm lỗi đánh máy. – greenoldman
Related: http://stackoverflow.com/questions/780287/what-are-some-example-use-cases-for-symbol-literals-in-scala – delnan
Related: http://stackoverflow.com/questions/1324466/thực tiễn-ví dụ-of-using-symbols-in-scala – Jesper
Related http://scala-programming-language.1934581.n4.nabble.com/The-need-for-symbol-literals-in-scala- td2313933.html Tôi vẫn không hiểu tại sao chúng ta cần một cú pháp đặc biệt cho điều đó. Scala đã có đủ cú pháp rồi. –