2012-03-15 21 views
13

Tôi có băm này:của Ruby biểu tượng vs Strings trong Hashes

{ 
    "title"=>"Navy to place breath-test machines on all its ships", 
    "url"=>"http://feeds.washingtonpost.com/click.phdo?i=a67626ca64a9f1766b8ba425b9482d49" 
} 

Nó chỉ ra rằng

hash[:url] == nil 

hash['url'] == "http://feeds.washingtonpost.com/click.phdo?i=a67626ca64a9f1766b8ba425b9482d49" 

Tại sao? Không nên nó làm việc với một trong hai?

Trả lời

23

Kể từ khi một biểu tượng là không giống như một chuỗi:

:url == 'url' #=> false 

Vì các khóa băm sẽ khác nhau. Có lẽ bạn đã thấy hành vi này trong Rails? Ruby on Rails sử dụng HashWithIndifferentAccess để ánh xạ mọi thứ vào một chuỗi nội bộ, vì vậy bạn có thể thực hiện điều này:

+2

Đó là Rails. Oh cuộc đời học Rails cùng lúc với Ruby. –

+4

Xin lỗi là có tính thực tế, nhưng HashWithInDifferentAccess thực sự chỉ kiểm tra xem khóa có phải là Biểu tượng và ép buộc vào một Chuỗi nếu trường hợp đó không phải là cách khác xung quanh https://github.com/rails/rails/blob/3d6eafe32ed498784dba2b9782bbf7df47ebeb6b/activesupport /lib/active_support/hash_with_indifferent_access.rb#L152 –

+0

Bắt tốt. Đã cập nhật. –

2

Tại sao? --- Vì :url'url' khác nhau, tức là, :url != 'url'.

Nó có hoạt động được không? --- Không.

4

:url là một Symbol đó là khác biệt so với các String'url'

> :ruby == "ruby­" 
=> false 

Bạn có thể chuyển đổi qua lại giữa hai sử dụng to_sto_sym

> "ruby".to_­sym 
=> :ruby 
> :ruby.to_s 
=> "ruby" 
Các vấn đề liên quan