Apakah ada perbedaan antara notasi hash `: key =>" value "` dan `key:" value "`?


124

Apakah ada perbedaan antara :key => "value"notasi (hashrocket) dan key: "value"(Ruby 1.9)?

Jika tidak, maka saya ingin menggunakan key: "value"notasi. Apakah ada permata yang membantu saya mengubah dari :x =>menjadi x:notasi?

Jawaban:


153

Ya, ada bedanya. Ini legal:

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

tapi ini bukan:

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

Anda juga dapat menggunakan apapun sebagai kunci =>sehingga Anda dapat melakukan ini:

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

tetapi Anda tidak dapat melakukan ini:

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

Gaya JavaScript ( key: value) hanya berguna jika semua kunci Hash Anda adalah simbol "sederhana" (kurang lebih sesuatu yang cocok /\A[a-z_]\w*\z/i, AFAIK parser menggunakan pola labelnya untuk kunci ini).

The :$insimbol gaya muncul sedikit adil ketika menggunakan MongoDB sehingga Anda akan berakhir pencampuran gaya Hash jika Anda menggunakan MongoDB. Dan, jika Anda pernah bekerja dengan kunci tertentu dari Hash ( h[:k]) daripada hanya seluruh hash ( h = { ... }), Anda masih harus menggunakan gaya titik dua-pertama untuk simbol; Anda juga harus menggunakan gaya titik dua terdepan untuk simbol yang Anda gunakan di luar Hash. Saya lebih suka konsisten jadi saya tidak peduli dengan gaya JavaScript sama sekali.

Beberapa masalah dengan gaya JavaScript telah diperbaiki di Ruby 2.2. Anda sekarang dapat menggunakan tanda kutip jika Anda memiliki simbol yang bukan label yang valid, misalnya:

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

Tetapi Anda masih membutuhkan hashrocket jika kunci Anda bukan simbol.


h = { 'a.b': 'c' }sekarang legal pada Ruby 2.2.0. Lihat bugs.ruby-lang.org/issues/4276
B Seven

@BSeven: Terima kasih, saya memperbarui jawaban hashrocket besar saya yang lain beberapa waktu yang lalu tetapi melewatkan yang ini.
mu terlalu pendek

Menurut Anda mengapa h[:s] = 42contoh tersebut berkaitan dengan pertanyaan ini? Menurut pendapat saya, gaya JavaScript vs gaya hashrocket hanya relevan dengan definisi pasangan kunci / nilai hash, dan tidak untuk menangani elemen hash dengan kunci. Oleh karena itu, h[s:] = 42contohnya tampaknya menyesatkan.
Nic Nilov

@NicNilov Itu relevan karena gaya JavaScript adalah tentang simbol karena kunci Hash dan notasi yang diizinkan, membingungkan, bergantung pada konteks.
mu terlalu pendek

Tidak setuju. Saat menangani slot hash dengan simbol, Anda selalu menggunakan h[:s] = 42notasi. Tidak ada pilihan lain. Saat Anda menentukan pasangan kunci / nilai, Anda mendapat opsi { key: value }gaya JavaScript atau { :key => value }gaya hashrocket. Skenario pengalamatan tampaknya masih belum relevan untuk apa yang menjadi fokus.
Nic Nilov

11

key: "value"adalah fitur kenyamanan Ruby 1.9; selama Anda tahu lingkungan Anda akan mendukungnya, saya tidak melihat alasan untuk tidak menggunakannya. Jauh lebih mudah untuk mengetik titik dua daripada roket, dan saya pikir itu terlihat jauh lebih bersih. Adapun ada permata untuk melakukan konversi, mungkin tidak, tetapi sepertinya pengalaman belajar yang ideal untuk Anda, jika Anda belum mengetahui manipulasi file dan ekspresi reguler.


5

Ruby hash-kunci ditugaskan oleh hash-roket dapat memfasilitasi string untuk pasangan kunci-nilai ( misalnya . 's' => x) Sedangkan tugas utama melalui simbol-simbol ( misalnya key: "value" atau :key => "value") tidak dapat ditugaskan dengan string. Meskipun roket hash memberikan kebebasan dan fungsionalitas untuk tabel hash, secara khusus mengizinkan string sebagai kunci , kinerja aplikasi mungkin lebih lambat daripada jika tabel hash dibuat dengan simbol sebagai kunci hash. Sumber daya berikut mungkin dapat menjelaskan perbedaan apa pun antara hashrocket dan simbol:


4

Penetapan key: valuegaya JSON adalah bagian dari sintaks hash Ruby 1.9 yang baru, jadi ingatlah bahwa sintaks ini tidak akan bekerja dengan versi Ruby yang lebih lama. Juga, kuncinya akan menjadi simbol. Jika Anda bisa hidup dengan dua batasan tersebut, hash baru berfungsi seperti hash lama; tidak ada alasan (selain gaya, mungkin) untuk mengubahnya.


5
PS: Ini bukan gaya JSON, ini adalah gaya JavaScript. JSON membutuhkan kunci untuk dikutip.
mu terlalu pendek

1

Melakukan :key => valueitu sama dengan melakukan key: value, dan sebenarnya hanya kenyamanan. Saya belum pernah melihat bahasa lain yang menggunakan =>, tetapi yang lain seperti Javascript menggunakan key: valuedalam tipe data yang setara dengan Hash.

Adapun permata untuk mengubah cara Anda menulis hash Anda, saya hanya akan tetap dengan cara Anda melakukannya untuk proyek Anda saat ini.

* Perhatikan bahwa dalam menggunakan key: valuekunci akan menjadi simbol, dan untuk mengakses nilai yang disimpan pada kunci itu dalam foohash akan tetap foo[:key].


Baik Perl dan PHP =>. Saya kira Ruby, yang sangat terinspirasi oleh Perl, meminjam sintaks dari Perl :)
Daniel Serodio
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.