2008-10-31 36 views

Trả lời

69

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.

+8

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

+5

@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

+2

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? –

1

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

0

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.

0

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.

+0

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. –

3

Sự khác biệt bổ sung giữa StringSymbol 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 classSymbol class.

0

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

9

sự khác nhau giữa biểu tượng & Strings là gì?

  1. Ký hiệu không thay đổi: Giá trị của chúng không đổi.
  2. 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.
  3. 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

0

Có hai khác biệt chính giữa String và Symbol trong Ruby.

  1. 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.

  2. 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 đủ:

2

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 đó.

Các vấn đề liên quan