Có sự khác biệt nào giữa các ký hiệu băm `: key =>.


124

Có sự khác biệt nào giữa các ký hiệu :key => "value"(hashrocket) và key: "value"(Ruby 1.9) không?

Nếu không, sau đó tôi muốn sử dụng key: "value"ký hiệu. Có một viên ngọc đó giúp tôi để chuyển đổi từ :x =>để x:ký hiệu?

Câu trả lời:


153

Có một sự khác biệt. Đây là hợp pháp:

h = { :$in => array }
h = { :'a.b' => 'c' }
h[:s] = 42

nhưng đây không phải là:

h = { $in: array }
h = { 'a.b': 'c' } # but this is okay in Ruby2.2+
h[s:] = 42

Bạn cũng có thể sử dụng bất cứ thứ gì làm chìa khóa =>để bạn có thể làm điều này:

h = { C.new => 11 }
h = { 23 => 'pancakes house?' }

nhưng bạn không thể làm điều này:

h = { C.new: 11 }
h = { 23: 'pancakes house?' }

Kiểu JavaScript ( key: value) chỉ hữu ích nếu tất cả các khóa Hash của bạn là các ký hiệu "đơn giản" (ít nhiều gì đó phù hợp /\A[a-z_]\w*\z/i, AFAIK trình phân tích cú pháp sử dụng mẫu nhãn của nó cho các khóa này).

Các :$inbiểu tượng kiểu hiển thị một chút công bằng khi sử dụng MongoDB, do đó bạn sẽ kết hợp trộn các kiểu Hash nếu bạn sử dụng MongoDB. Và, nếu bạn từng làm việc với các khóa cụ thể của Băm ( h[:k]) thay vì chỉ toàn bộ băm ( h = { ... }), bạn vẫn sẽ phải sử dụng kiểu dấu hai chấm đầu tiên cho các biểu tượng; bạn cũng sẽ phải sử dụng kiểu dấu hai chấm hàng đầu cho các biểu tượng mà bạn sử dụng bên ngoài Băm. Tôi thích nhất quán hơn nên tôi không bận tâm đến kiểu JavaScript.

Một số vấn đề với kiểu JavaScript đã được khắc phục trong Ruby 2.2. Bây giờ bạn có thể sử dụng dấu ngoặc kép nếu bạn có các biểu tượng không có nhãn hợp lệ, ví dụ:

h = { 'where is': 'pancakes house?', '$set': { a: 11 } }

Nhưng bạn vẫn cần hashrocket nếu khóa của bạn không phải là biểu tượng.


h = { 'a.b': 'c' }hiện là hợp pháp kể từ Ruby 2.2.0. Xem lỗi.ruby
B Bảy

@BSeven: Cảm ơn, tôi đã cập nhật câu trả lời hashrocket lớn khác của tôi một lúc trước nhưng đã bỏ lỡ câu trả lời này.
mu quá ngắn

Tại sao bạn cảm thấy h[:s] = 42ví dụ liên quan đến câu hỏi này? Theo tôi, kiểu JavaScript so với kiểu hashrocket chỉ liên quan đến định nghĩa cặp khóa / giá trị băm và không giải quyết các phần tử băm bằng các khóa. Do đó, h[s:] = 42ví dụ có vẻ sai lệch.
Nic Nilov 20/07/2015

@NicNilov Điều đó có liên quan vì kiểu JavaScript là về các biểu tượng như các khóa Hash và các ký hiệu được phép, một cách khó hiểu, phụ thuộc vào ngữ cảnh.
mu quá ngắn

Không thể đồng ý. Khi giải quyết một vị trí băm bằng ký hiệu, bạn luôn sử dụng h[:s] = 42ký hiệu. Không có lựa chọn nào khác. Đó là khi bạn xác định các cặp khóa / giá trị, bạn có các tùy chọn về { key: value }kiểu JavaScript hoặc { :key => value }kiểu hashrocket. Kịch bản địa chỉ dường như vẫn chưa liên quan đến những gì đang tập trung.
Nic Nilov 20/07/2015

11

key: "value"là một tính năng tiện lợi của Ruby 1.9; miễn là bạn biết môi trường của bạn sẽ hỗ trợ nó, tôi thấy không có lý do gì để không sử dụng nó. Thật dễ dàng để gõ một dấu hai chấm hơn một tên lửa, và tôi nghĩ rằng nó trông sạch sẽ hơn nhiều. Đối với việc có một viên ngọc để thực hiện chuyển đổi, có thể là không, nhưng có vẻ như đó là một trải nghiệm học tập lý tưởng cho bạn, nếu bạn chưa biết thao tác tập tin và các biểu thức thông thường.


5

Ruby băm-phím bằng cách băm-rocket giao có thể tạo điều kiện cho dây cho cặp khóa-giá trị ( ví dụ . 's' => x) Trong khi nhiệm vụ quan trọng qua những biểu tượng ( ví dụ key: "value" hay :key => "value") không thể được gán với chuỗi. Mặc dù tên lửa băm cung cấp sự tự do và chức năng cho các bảng băm, cụ thể là cho phép các chuỗi làm khóa , hiệu suất ứng dụng có thể chậm hơn so với khi các bảng băm được xây dựng với các ký hiệu là khóa băm. Các tài nguyên sau đây có thể có thể làm rõ bất kỳ sự khác biệt nào giữa các biểu tượng và biểu tượng:


4

Các key: valuebài tập kiểu JSON là một phần của cú pháp băm Ruby 1.9 mới, vì vậy hãy nhớ rằng cú pháp này sẽ không hoạt động với các phiên bản cũ hơn của Ruby. Ngoài ra, các phím sẽ là biểu tượng. Nếu bạn có thể sống với hai ràng buộc đó, các giá trị băm mới hoạt động giống như các giá trị băm cũ; không có lý do (ngoài phong cách, có lẽ) để chuyển đổi chúng.


5
PS: Nó không phải là kiểu JSON, nó là kiểu JavaScript. JSON yêu cầu các khóa được trích dẫn.
mu quá ngắn

1

Làm :key => valuecũng giống như làm key: value, và thực sự chỉ là một tiện lợi. Tôi chưa thấy các ngôn ngữ khác sử dụng =>, nhưng các ngôn ngữ khác như Javascript sử dụng các key: valuekiểu dữ liệu tương đương Hash của họ.

Đối với một viên ngọc để chuyển đổi cách bạn viết ra băm, tôi sẽ chỉ gắn bó với cách bạn đang làm cho dự án hiện tại của bạn.

* Lưu ý rằng trong việc sử dụng key: valuekhóa sẽ là một biểu tượng và để truy cập giá trị được lưu trữ tại khóa đó trong foohàm băm sẽ vẫn còn foo[:key].


Cả Perl và PHP đều sử dụng =>. Tôi đoán rằng Ruby, được Perl truyền cảm hứng rất nhiều, đã mượn cú pháp từ Perl :)
Daniel Serodio
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.