Sự khác biệt giữa một chuỗi ký tự và một biểu tượng trong Ruby là gì và khi nào bạn nên sử dụng một biểu tượng khác?Sự khác biệt giữa một chuỗi ký tự và một biểu tượng trong Ruby là gì?
Trả lời
Sự khác biệt chính là nhiều biểu tượng đại diện cho một giá trị duy nhất giống hệt nhau trong khi điều này không đúng với chuỗi. Ví dụ:
irb(main):007:0> :test.object_id
=> 83618
irb(main):008:0> :test.object_id
=> 83618
irb(main):009:0> :test.object_id
=> 83618
3 tham chiếu đến ký hiệu: kiểm tra, tất cả cùng một đối tượng.
irb(main):010:0> "test".object_id
=> -605770378
irb(main):011:0> "test".object_id
=> -605779298
irb(main):012:0> "test".object_id
=> -605784948
3 tham chiếu đến chuỗi "kiểm tra", tất cả các đối tượng khác nhau.
Điều này có nghĩa là việc sử dụng biểu tượng có khả năng tiết kiệm một lượng bộ nhớ tốt tùy thuộc vào ứng dụng. Nó cũng nhanh hơn để so sánh các biểu tượng cho sự bình đẳng vì chúng là cùng một đối tượng, so sánh các chuỗi giống nhau là chậm hơn nhiều vì các giá trị chuỗi cần được so sánh thay vì chỉ các id đối tượng.
Theo như khi sử dụng, tôi thường sử dụng chuỗi cho hầu hết mọi thứ ngoại trừ những thứ như các khóa băm mà tôi thực sự muốn một số nhận dạng duy nhất, không phải là một chuỗi.
Biểu tượng là thứ bạn sử dụng để thể hiện tên và chuỗi. Bạn sẽ muốn sử dụng một biểu tượng khi bạn có thể cần phải sử dụng một chuỗi nhiều lần như thế này dễ dàng hơn và hiệu quả hơn.
Và chỉ thấy điều này qua google, có thể cung cấp chi tiết hơn: Here you go
Biểu tượng và chuỗi là hoàn toàn khác nhau this post có một cái nhìn sâu sắc ít vào sự khác biệt. Khi nào và ở đâu để sử dụng chúng, có một bài viết khá rộng rãi về chủ đề này trên has many :through.
Là một điểm đối kháng, một người bạn của tôi gần đây đã viết a post titled "Ruby Rant" mang lại cái nhìn khác về các biểu tượng của Ruby.
Biểu tượng có thể rất hữu ích và cung cấp hiệu suất tốt hơn so với các tùy chọn mà các ngôn ngữ khác cung cấp nhưng, giống như hầu hết mọi thứ khác, cũng có thể bị lạm dụng. Điểm 4a lại: API có thể là một PITA lớn nhưng điều này phần lớn được giải quyết trong Ruby 1.9, nơi các biểu tượng có thể được so sánh với các chuỗi trực tiếp, trong số những thứ khác. –
Sự khác biệt bổ sung giữa String
và Symbol
là một String
có nhiều phương pháp hơn để xử lý chuỗi, trong khi Symbol
là đối tượng tương đối gầy.
Xem tài liệu cho số String
class và Symbol
class.
Strings là Mutable, biểu tượng bất biến Arre
Lưu ý: đối tượng Mutable có thể được thay đổi sau khi chuyển nhượng, trong khi đối tượng bất biến chỉ có thể được ghi đè http://www.robertsosinski.com/2009/01/11/the-difference-between-ruby-symbols-and-strings/
biểu tượng là bất biến và chuỗi là có thể thay đổi.
khi chúng tôi thực hiện bất kỳ thao tác nào trên chuỗi, sau đó nó tạo đối tượng mới và ghi nhớ. khi chúng ta thực hiện ngày càng nhiều thao tác trên chuỗi có nghĩa là chúng ta đang tiêu thụ nhiều bộ nhớ hơn.
biểu tượng là đối tượng không thay đổi có nghĩa là nếu chúng ta thực hiện bất kỳ thao tác nào thì nó thực hiện thay đổi trong đối tượng ban đầu, Nó sẽ không tạo ra bất kỳ đối tượng nào, đó là lý do tại sao nó có lợi hơn.
để biết thêm, bạn có thể click here
sự khác nhau giữa biểu tượng & Strings là gì?
- Ký hiệu không thay đổi: Giá trị của chúng không đổi.
- Sử dụng nhiều biểu tượng giống nhau có cùng ID đối tượng và cùng một đối tượng so với chuỗi sẽ là đối tượng khác với ID đối tượng duy nhất, mọi lúc.
- Bạn không thể gọi bất kỳ phương thức String nào như #upcase, #split trên Biểu tượng.
Từ Understanding Differences Between Symbols & Strings in Ruby
Nếu bạn là Trung Quốc, bạn cũng có thể đọc 理解 Ruby Symbol
Có hai khác biệt chính giữa String và Symbol trong Ruby.
String là có thể thay đổi và Symbol không phải là
Bởi vì String là có thể thay đổi, nó có thể được thay đổi trong đâu đó và có thể dẫn đến kết quả là không đúng.
Ký hiệu là không thay đổi.
String là một đối tượng vì vậy nó cần cấp phát bộ nhớ
đặt "abc" .object_id # 70322858612020
puts "abc" .object_id # 70322846847380
puts "abc". object_id # 70322846815460
Mặt khác, Symbol sẽ là thứ e cùng một đối tượng:
puts :abc.object_id # 1147868
puts :abc.object_id # 1147868
puts :abc.object_id # 1147868
Vì vậy, chuỗi sẽ mất nhiều thời gian hơn để sử dụng và so sánh hơn Biểu tượng.
Bạn có thể đọc thêm here để hiểu đầy đủ:
Tuyên bố
foo = "bar"
tạo ra một đối tượng mới trong bộ nhớ.Nếu chúng ta lặp lại các tuyên bố
foo = "bar"
Chúng tôi tạo ra một đối tượng khác
để làm cho nó rõ ràng hơn hãy thử đoạn code dưới đây vào ruby console
foo = "bar"
puts "string #{foo} with object id = #{foo.object_id}"
foo = "bar"
puts "string #{foo} with object id = #{foo.object_id}"
bạn sẽ nhận được kết quả như
string bar with object id = 70358547221180
string bar with object id = 70358548927060
hiển thị rõ ràng có hai đối tượng khác nhau cho cùng một chuỗi. Bây giờ nếu bạn sử dụng biểu tượng nó sẽ tạo ra một đối tượng cho mỗi biểu tượng nên
foo = :bar
puts "symbol #{foo} with object id = #{foo.object_id}"
foo = :bar
puts "symbol #{foo} with object id = #{foo.object_id}"
lãm
symbol bar with object id = 7523228
symbol bar with object id = 7523228
có nghĩa là chỉ có một đối tượng cho: thanh
Biểu tượng hơn nữa là bất biến và Bạn không thể gọi bất kỳ phương thức String nào như #upcase, #split
trên Biểu tượng.
So sánh biểu tượng nhanh hơn so sánh Chuỗi.
Ký hiệu có thể được coi là chuỗi không đổi/không thay đổi được tạo thành một tập hợp duy nhất được chuyển đổi hiệu quả thành con trỏ bộ nhớ trên vùng heap. Điều này có nghĩa là so sánh hai ký hiệu là nhanh vì bạn chỉ so sánh 2 số nguyên (con trỏ bộ nhớ.)
Các chuỗi có thể thay đổi được, do đó con trỏ bộ nhớ có thể thay đổi sau khi sửa đổi. Điều này có nghĩa là các hoạt động so sánh chậm hơn vì các bản sao có thể tồn tại tương đương ngữ nghĩa.
Sử dụng
sử dụng Symbol
khi bạn chắc chắn rằng giá trị sẽ không thay đổi. Ví dụ sử dụng các ký hiệu cho các khóa băm, sử dụng chuỗi khi bạn muốn thay đổi giá trị hoặc muốn sử dụng phương thức chuỗi trên đó.
- 1. Sự khác nhau giữa một đối tượng JS bằng chữ và một chuỗi JSON là gì?
- 2. Sự khác biệt chức năng giữa một cá thể và một đối tượng là gì?
- 3. sự khác biệt giữa/là gì nó/và/\ Ait \ Z/
- 4. Sự khác biệt giữa 'ký tự' và 'octet' trong băm
- 5. Sự khác biệt giữa nguyên tử và biểu tượng trong Lisp thường là gì?
- 6. Sự khác biệt giữa một đối tượng và một băm?
- 7. Sự khác biệt giữa một cá thể và một đối tượng là gì?
- 8. Sự khác biệt giữa quét và khớp trên chuỗi Ruby
- 9. Sự khác biệt giữa móc và gọi lại là gì?
- 10. Sự khác biệt giữa "mã hóa", "bộ ký tự" và "trang mã" là gì?
- 11. Sự khác biệt của Ruby giữa gửi và instance_eval?
- 12. Ruby: Thoát các ký tự đặc biệt trong một chuỗi
- 13. Sự khác biệt giữa trang mã và mã hóa ký tự là gì?
- 14. Sự khác biệt giữa setDisplayHomeAsUpEnabled và setHomeButtonEnabled là gì?
- 15. Sự khác biệt của câu lệnh và biểu thức trong Ruby là gì?
- 16. Sự khác nhau giữa một đối tượng và một lớp trong Perl là gì?
- 17. Sự khác nhau giữa một chuỗi COM (BSTR) và một chuỗi .NET là gì?
- 18. Sự khác biệt giữa mảng ký tự và con trỏ
- 19. Sự khác nhau giữa trừu tượng và ảo là gì?
- 20. Sự khác biệt chính giữa Sinatra và Ramaze là gì?
- 21. Sự khác biệt giữa một ký tự đại diện không ràng buộc và một kiểu thô
- 22. là gì sự khác biệt giữa SQL_Latin1_General_CP1_CI_AS và SQL_Latin1_General_CP1_CI_AI
- 23. Tìm sự khác biệt giữa các chuỗi trong Ruby
- 24. trong C# sự khác biệt giữa mẫu chiến lược và đại biểu là gì?
- 25. Sự khác biệt giữa việc sử dụng con trỏ ký tự và mảng ký tự
- 26. Thuật ngữ: Sự khác biệt giữa một lớp học và một thành phần là gì?
- 27. Trong Ember.js, sự khác biệt giữa [] và Ember.A ([]) là gì?
- 28. Sự khác biệt giữa Ruby và Ruby on Rails là gì?
- 29. Tại sao là sự khác biệt giữa một biểu thức và một tuyên bố
- 30. Trong C++, sự khác biệt giữa một phương pháp và một chức năng là những gì
Mặc dù các ký hiệu không được bộ thu gom rác dọn sạch và dính xung quanh cho đến khi kết thúc phiên bản thời gian chạy. Vì vậy, nếu bạn khai báo rất nhiều biểu tượng, bạn có thể lãng phí rất nhiều bộ nhớ. – Daemin
@Daemin: Thông thường, đây không phải là vấn đề trừ khi bạn đang tự động tạo biểu tượng en-masse. Đây là nguyên nhân gây ra bong bóng bộ nhớ trong một số ứng dụng. Nếu bạn sử dụng các ký hiệu mã hóa cứng trong mã của mình, bạn tương đối an toàn. – Pistos
Tôi không chắc tôi hiểu câu đầu tiên của bạn. Khi mọi người nói rằng mỗi bông tuyết là duy nhất, có nghĩa là mỗi bông tuyết là khác nhau. Mỗi lần xuất hiện khác nhau. Tuy nhiên trong ví dụ mã biểu tượng của bạn, bạn cho thấy mỗi lần xuất hiện chính xác cùng một đối tượng. Liệu 'giống hệt' có phải là một từ tốt hơn? –