Jawaban:
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 :$in
simbol 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[:s] = 42
contoh 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:] = 42
contohnya tampaknya menyesatkan.
h[:s] = 42
notasi. 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.
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.
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:
Penetapan key: value
gaya 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.
Melakukan :key => value
itu sama dengan melakukan key: value
, dan sebenarnya hanya kenyamanan. Saya belum pernah melihat bahasa lain yang menggunakan =>
, tetapi yang lain seperti Javascript menggunakan key: value
dalam 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: value
kunci akan menjadi simbol, dan untuk mengakses nilai yang disimpan pada kunci itu dalam foo
hash akan tetap foo[:key]
.
=>
. Saya kira Ruby, yang sangat terinspirasi oleh Perl, meminjam sintaks dari Perl :)
h = { 'a.b': 'c' }
sekarang legal pada Ruby 2.2.0. Lihat bugs.ruby-lang.org/issues/4276