2016-04-09 15 views
13

Sử dụng Ruby 2.3:Tại sao khóa chuỗi này trong một băm được chuyển đổi thành một biểu tượng?

Ví dụ 1, khóa chuỗi "a" được tự động chuyển đổi thành một biểu tượng, trong khi với ví dụ 2, nó vẫn là một chuỗi.

Ví dụ 1

{"a": 1} 
# => {:a=>1} 

Ví dụ 2

{"a"=>"c"} 
# => {"a"=>"c"} 

Tôi nghĩ : cũng giống như phong cách cũ rocket băm => cú pháp. Chuyện gì vậy? Tại sao tôi chưa bao giờ nhận thấy điều này trong Rails? Có phải là HashWithIndifferentAccess đang che khuất điều này không?

+0

@Zabba Tại sao bạn cần phải thêm phiên bản đó? Nó chỉ hoạt động trong Rubys gần đây. Nếu OP cho biết nó hoạt động, nó đòi hỏi rằng nó là một phiên bản gần đây. – sawa

+2

OP đã đề cập rằng phiên bản trong câu hỏi nên không thích hợp để xóa phiên bản đó vì việc xóa nó sẽ thay đổi ý nghĩa và ý định của câu hỏi, do đó, chỉ là bản gốc ở đây. – Zabba

+1

Nó không phải là một khóa chuỗi, đó là một chìa khóa biểu tượng. Không có gì đang được thay đổi. –

Trả lời

3

Đó là vì cú pháp băm mới được giới thiệu với ruby ​​1.9. Cú pháp với dấu hai chấm chỉ hoạt động với các phím biểu tượng. Nó được gọi là băm "biểu tượng đối tượng" và nó chỉ là cú pháp cú pháp cho kiểu băm phổ biến nhất. Một điểm khác cho tôi, nó gần gũi hơn với ký hiệu đối tượng javascript.

Nếu tôi có các loại khóa hỗn hợp thì tôi thích kiểu cũ hơn (cú pháp băm tên lửa), nhưng tùy thuộc vào bạn. Trộn hai kiểu trông xấu với tôi.

+2

Đây không phải là cú pháp được giới thiệu trong ruby ​​1.9. – sawa

+0

Nó không gần với ký pháp javascript. Javascript không phân biệt các chuỗi và ký hiệu. – sawa

+2

@sawa cú pháp mới được giới thiệu trong ruby ​​1.9 và nó gần gũi hơn với ký pháp javascript. – Reyko

20

Trong Ruby 2,3 (0,0), đây là tất cả như nhau:

{:"a" => 1} 
{"a": 1}, 
{:a => 1} 
{a: 1} 

Họ tất cả dịch để điều tương tự: a là một biểu tượng trong tất cả những trường hợp này.

{"a"=>1} khác nhau: a là một chuỗi trong trường hợp này.

0

Theo Ruby documentation:

đối tượng Blockquote Symbol đại diện cho tên và một số chuỗi bên trong thông dịch viên Ruby. Chúng được tạo ra bằng cách sử dụng cú pháp: name và: "string" literals, và bởi các phương thức to_sym khác nhau. [...]

này có nghĩa là chạy:

$ ruby -e ruby -e "h = {key: \"value\"}; puts h" 
$ ruby -e ruby -e "h = {:key => \"value\"}; puts h" 
$ ruby -e ruby -e "h = {\"key\": \"value\"}; puts h" 
$ ruby -e ruby -e "h = {:\"key\" => \"value\"}; puts h" 
$ ruby -e ruby -e "h = {\"#{:key}\": \"value\"}; puts h" 

Sẽ tạo ra kết quả tương tự:

$ {:key=>"value"} 
Các vấn đề liên quan