2010-03-10 35 views
11

Khi tôi bắt đầu đọc và học ruby, tôi đọc một số thứ về sức mạnh của các ký hiệu ruby ​​qua các chuỗi: các ký hiệu chỉ được lưu trong bộ nhớ một lần, trong khi các chuỗi được lưu trong bộ nhớ một lần cho mỗi chuỗi, ngay cả khi chúng giống nhau.Tại sao không có nhiều dự án sử dụng Ruby Symbols thay vì Strings?

Ví dụ: Tay vịn params Hash trong Controller có một loạt các phím như biểu tượng:

params[:id] or 
params[:title]... 

Nhưng dự án decently cỡ khác như Sinatra và Jekyll không làm điều đó:

Jekyll :

post.data["title"] or 
post.data["tags"]... 

Sinatra:

params["id"] or 
params["title"]... 

Điều này làm cho việc đọc mã mới trở nên khó khăn một chút và làm cho việc chuyển mã trở nên khó khăn và tìm ra lý do tại sao sử dụng biểu tượng không hoạt động. Có nhiều ví dụ khác về điều này và nó khá là khó hiểu. Chúng ta nên hay không nên sử dụng các biểu tượng trong trường hợp này? Ưu điểm của biểu tượng và chúng ta có nên sử dụng chúng ở đây không?

Trả lời

4

Trong ruby, sau khi tạo AST, mỗi biểu tượng được biểu diễn dưới dạng số nguyên duy nhất. Có biểu tượng như các phím băm làm cho máy tính nhanh hơn rất nhiều, vì hoạt động chính là so sánh.

+0

vậy lý do các dự án này không thực hiện điều này phải là vì nó không phải là phổ biến kiến ​​thức, tôi có thể 't nghĩ về bất cứ điều gì khác. –

+1

xem xét tốc độ "phần còn lại" của mã ruby, tối ưu hóa sym là loại vô nghĩa, vì vậy trường hợp không thiếu kiến ​​thức, mà là sở thích cá nhân. đường ray sử dụng nó nhiều hơn cho các thẩm mỹ imho, đẹp hơn để gõ: x hơn "x" – clyfe

+5

lol, nó là đẹp hơn. nhưng nếu một cái gì đó được tối ưu hóa hơn, tôi nghĩ chúng ta nên sử dụng nó, đặc biệt nếu nó thú vị hơn để viết. –

4

Ký hiệu không phải là rác được thu thập AFAIK, do đó có thể là một điều cần chú ý, nhưng ngoại trừ việc chúng thực sự tuyệt vời như các khóa băm.

+1

Các ký hiệu Ruby bên trong được lưu trữ dưới dạng số nguyên, vì vậy chúng lớn như các số nguyên trên nền tảng của bạn. Bên cạnh đó - và cũng giống như các chữ số nguyên - chúng là duy nhất (không bao giờ có hai hoặc 1 đối tượng foo), vì vậy tôi sẽ không lo lắng về GC quá nhiều. –

+0

[Ký hiệu là rác được thu thập từ Ruby 2.2] (https://bugs.ruby-lang.org/issues/9634) – Dennis

0

Một lý do cho việc sử dụng chuỗi có thể là việc sử dụng yaml để xác định các giá trị.

require 'yaml' 
data = YAML.load(<<-data 
    one: 
     title: one 
     tag: 1 
    two: 
     title: two 
     tag: 2 
    data 
) #-> {"one"=>{"title"=>"one", "tag"=>1}, "two"=>{"title"=>"two", "tag"=>2}} 

Bạn có thể sử dụng yaml để xác định biểu tượng-phím:

require 'yaml' 
data = YAML.load(<<-data 
    :one: 
     :title: one 
     :tag: 1 
    :two: 
     :title: two 
     :tag: 2 
    data 
) #-> {:one=>{:title=>"one", :tag=>1}, :two=>{:title=>"two", :tag=>2}} 

Nhưng trong những biểu tượng yaml nét nhìn một chút lạ, dây trông tự nhiên hơn. Một lý do khác cho chuỗi là khóa: Tùy thuộc vào trường hợp sử dụng, có thể hợp lý để sắp xếp theo các khóa, nhưng bạn không thể sắp xếp biểu tượng (ít nhất là không có chuyển đổi thành chuỗi).

-1

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.

Tôi thường sử dụng chuỗi cho hầu hết mọi thứ, trừ những thứ như phím băm mà tôi thực sự muốn có một định danh duy nhất, không phải là một chuỗi

+0

Cách này trả lời câu hỏi? Nó không phải là "sự khác biệt giữa dây và biểu tượng" là gì hoặc "tôi sử dụng biểu tượng ở đâu" –

+0

Ngoài ra, ngay cả trong câu trả lời của bạn, bạn vẫn mâu thuẫn với chính mình. Bạn mô tả các biểu tượng tuyệt vời như thế nào, và sau đó nói rằng bạn thích sử dụng các chuỗi ở khắp mọi nơi. –

+0

vâng tôi vẫn nói các biểu tượng tốt hơn để sử dụng nhưng nó phụ thuộc vào các yêu cầu/yêu cầu mà tôi đã đề cập ở dòng cuối cùng. –

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