มีความแตกต่างระหว่างสัญกรณ์แฮช ": key =>" value "และ" key: "value" หรือไม่


124

มีความแตกต่างระหว่างสัญกรณ์:key => "value"(hashrocket) และkey: "value"(Ruby 1.9) หรือไม่?

ถ้าไม่เช่นนั้นฉันต้องการใช้key: "value"สัญกรณ์ มีอัญมณีที่ช่วยให้ผมที่จะแปลงจาก:x =>การx:จด?

คำตอบ:


153

ใช่มีความแตกต่าง สิ่งเหล่านี้ถูกกฎหมาย:

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

แต่สิ่งเหล่านี้ไม่ใช่:

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

คุณยังสามารถใช้อะไรก็ได้เป็นกุญแจ=>เพื่อให้คุณทำสิ่งนี้ได้:

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

แต่คุณไม่สามารถทำได้:

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

รูปแบบ JavaScript ( key: value) จะมีประโยชน์ก็ต่อเมื่อปุ่ม Hash ทั้งหมดของคุณเป็นสัญลักษณ์ "ธรรมดา" (บางอย่างที่ตรงกันมากขึ้นหรือน้อยลง/\A[a-z_]\w*\z/iAFAIK โปรแกรมแยกวิเคราะห์จะใช้รูปแบบป้ายกำกับสำหรับคีย์เหล่านี้)

:$inสัญลักษณ์สไตล์แสดงยุติธรรมบิตเมื่อใช้ MongoDB ดังนั้นคุณจะจบลงด้วยการผสมรูปแบบแฮถ้าคุณใช้ MongoDB และหากคุณเคยทำงานกับคีย์เฉพาะของh[:k]แฮช ( h = { ... }) แทนที่จะใช้แฮชทั้งหมด ( ) คุณจะยังต้องใช้สไตล์โคลอนเป็นอันดับแรกสำหรับสัญลักษณ์ คุณจะต้องใช้สไตล์โคลอนนำหน้าสำหรับสัญลักษณ์ที่คุณใช้นอกแฮช ฉันชอบที่จะสอดคล้องกันดังนั้นฉันจึงไม่ต้องกังวลกับสไตล์ JavaScript เลย

ปัญหาบางอย่างเกี่ยวกับรูปแบบ JavaScript ได้รับการแก้ไขแล้วใน Ruby 2.2 ตอนนี้คุณสามารถใช้เครื่องหมายคำพูดได้หากคุณมีสัญลักษณ์ที่ไม่ใช่ป้ายกำกับที่ถูกต้องตัวอย่างเช่น:

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

แต่คุณยังต้องใช้แฮชร็อกเก็ตหากคีย์ของคุณไม่ใช่สัญลักษณ์


h = { 'a.b': 'c' }ตอนนี้ถูกกฎหมายสำหรับ Ruby 2.2.0 ดูbugs.ruby-lang.org/issues/4276
B เซเว่น

@BSeven: ขอบคุณฉันอัปเดตคำตอบ hashrocket ขนาดใหญ่อื่น ๆ ของฉันเมื่อสักครู่ที่ผ่านมา แต่พลาดคำตอบนี้
สั้นเกินไป

เหตุใดคุณจึงรู้สึกว่าh[:s] = 42ตัวอย่างนี้เกี่ยวข้องกับคำถามนี้ ในความคิดของฉันสไตล์ JavaScript เทียบกับสไตล์แฮชร็อคเกตนั้นเกี่ยวข้องกับการกำหนดคู่คีย์ / ค่าแฮชเท่านั้นและไม่เกี่ยวข้องกับการกำหนดองค์ประกอบแฮชด้วยคีย์ ดังนั้นh[s:] = 42ตัวอย่างจึงดูเหมือนจะทำให้เข้าใจผิด
Nic Nilov

@NicNilov มีความเกี่ยวข้องเนื่องจากรูปแบบ JavaScript เกี่ยวกับสัญลักษณ์เป็นปุ่ม Hash และสัญกรณ์ที่อนุญาตนั้นขึ้นอยู่กับบริบทอย่างสับสน
สั้นเกินไป

ไม่สามารถตกลงกันได้ เมื่อระบุช่องแฮชด้วยสัญลักษณ์คุณจะใช้h[:s] = 42สัญกรณ์เสมอ ไม่มีทางเลือกอื่น เมื่อคุณกำหนดคู่คีย์ / ค่าคุณจะมีตัวเลือกของ{ key: value }สไตล์ JavaScript หรือ{ :key => value }สไตล์แฮชร็อคเกต สถานการณ์การกำหนดประเด็นยังดูเหมือนจะไม่เกี่ยวข้องกับสิ่งที่อยู่ในโฟกัส
Nic Nilov

11

key: "value"เป็นคุณสมบัติอำนวยความสะดวกของ Ruby 1.9; ตราบใดที่คุณรู้ว่าสภาพแวดล้อมของคุณจะรองรับฉันก็ไม่เห็นเหตุผลที่จะไม่ใช้มัน การพิมพ์โคลอนง่ายกว่าจรวดมากและฉันคิดว่ามันดูสะอาดกว่ามาก สำหรับการมีอัญมณีในการแปลงอาจจะไม่ใช่ แต่ดูเหมือนว่าจะเป็นประสบการณ์การเรียนรู้ที่ดีสำหรับคุณหากคุณยังไม่รู้จักการจัดการไฟล์และนิพจน์ทั่วไป


5

ทับทิมกัญชาคีย์ได้รับมอบหมายจากกัญชาจรวดสามารถอำนวยความสะดวกสำหรับสตริงคู่ค่าคีย์ ( เช่น . 's' => x) ในขณะที่ได้รับมอบหมายที่สำคัญผ่านทางสัญลักษณ์ ( เช่น key: "value"หรือ:key => "value") ไม่สามารถกำหนดกับสตริง แม้ว่าแฮชจรวดจะให้อิสระและการทำงานสำหรับตารางแฮชโดยเฉพาะการอนุญาตให้สตริงเป็นคีย์ประสิทธิภาพของแอปพลิเคชันอาจช้ากว่าที่ตารางแฮชจะถูกสร้างด้วยสัญลักษณ์เป็นแฮชคีย์ แหล่งข้อมูลต่อไปนี้อาจชี้แจงความแตกต่างระหว่างแฮชร็อกเก็ตและสัญลักษณ์:


4

การkey: valueกำหนดสไตล์ JSON เป็นส่วนหนึ่งของไวยากรณ์แฮช Ruby 1.9 ใหม่ดังนั้นโปรดทราบว่าไวยากรณ์นี้จะใช้ไม่ได้กับ Ruby เวอร์ชันเก่า นอกจากนี้ปุ่มจะเป็นสัญลักษณ์ หากคุณสามารถอยู่กับข้อ จำกัด ทั้งสองนี้แฮชใหม่จะทำงานเหมือนกับแฮชเก่า ไม่มีเหตุผลใด (นอกจากสไตล์) ที่จะแปลงพวกเขา


5
PS: ไม่ใช่สไตล์ JSON แต่เป็นสไตล์ JavaScript JSON ต้องการคีย์ที่จะยกมา
สั้นเกินไป

1

การทำ:key => valueก็เหมือนกับการทำkey: valueและเป็นเพียงแค่ความสะดวกเท่านั้น ฉันไม่เคยเห็นภาษาอื่นที่ใช้=>แต่ภาษาอื่น ๆ เช่น Javascript ใช้key: valueในประเภทข้อมูลที่เทียบเท่ากับแฮช

สำหรับอัญมณีที่แปลงวิธีที่คุณเขียนแฮชของคุณฉันจะยึดตามวิธีที่คุณทำกับโครงการปัจจุบันของคุณ

* หมายเหตุว่าในการใช้key: valueที่สำคัญจะเป็นสัญลักษณ์และการเข้าถึงค่าที่เก็บไว้ที่สำคัญที่อยู่ในกัญชาจะยังคงเป็นfoofoo[:key]


ทั้ง Perl =>และใช้ ฉันเดาว่า Ruby ได้รับแรงบันดาลใจอย่างมากจาก Perl ยืมไวยากรณ์จาก Perl :)
Daniel Serodio
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.