`: 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?' }

자바 스크립트 스타일 ( key: value)은 모든 해시 키가 "간단한"기호 인 경우에만 유용합니다 ( /\A[a-z_]\w*\z/i, AFAIK 가 일치하는 것이 더 많거나 적고 파서가 이러한 키에 레이블 패턴을 사용함).

:$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 : 고맙습니다. 얼마 전에 다른 큰 해시 로켓 답변을 업데이트 했지만이 답변을 놓쳤습니다.
뮤가 너무 짧습니다.

h[:s] = 42예제가이 질문과 관련이 있다고 생각하는 이유는 무엇 입니까? 제 생각에는 JavaScript 스타일과 해시 로켓 스타일은 해시 키 / 값 쌍 정의에만 관련이 있으며 키로 해시 요소를 처리하는 것과는 관련이 없습니다. 따라서이 h[s:] = 42예는 오해의 소지가있는 것 같습니다.
Nic Nilov

@NicNilov JavaScript 스타일은 해시 키와 허용되는 표기법이 문맥에 따라 다르기 때문에 기호에 관한 것이기 때문에 관련이 있습니다.
mu가 너무 짧습니다.

동의 할 수 없습니다. 기호로 해시 슬롯을 지정할 때 항상 h[:s] = 42표기법을 사용 합니다. 다른 옵션은 없습니다. 키 / 값 쌍을 정의 할 때 { key: value }JavaScript 스타일 또는 { :key => value }해시 로켓 스타일 옵션이 있습니다 . 주소 지정 시나리오는 여전히 초점이 맞춰진 항목과 관련이없는 것 같습니다.
Nic Nilov 2015

11

key: "value"Ruby 1.9의 편리한 기능입니다. 당신의 환경이 그것을 지원할 것이라는 것을 아는 한, 나는 그것을 사용하지 않을 이유가 없다고 생각합니다. 로켓보다 콜론을 입력하는 것이 훨씬 쉬우 며 훨씬 깔끔해 보입니다. 변환을 수행 할 보석이 있다는 것은 아마 아닐 것입니다. 그러나 파일 조작과 정규 표현식을 아직 모른다면 이상적인 학습 경험처럼 보입니다.


5

해시 로켓에 의해 할당 된 루비 해시 키는 키-값 쌍 ( 예 : . 's' => x)에 대한 문자열을 용이하게 할 수 있지만 기호 ( 예 : key: "value" 또는 :key => "value") 를 통한 키 할당 은 문자열로 할당 될 수 없습니다. 해시 로켓이 해시 테이블에 대한 자유와 기능을 제공하고, 특히 문자열을 키로 허용 하지만 응용 프로그램 성능은 해시 키로 기호를 사용하여 해시 테이블을 구성하는 경우보다 느릴 수 있습니다. 다음 리소스를 통해 해시 로켓과 기호 간의 차이점을 명확히 할 수 있습니다.


4

key: valueJSON 스타일의 과제는 새로운 루비 1.9 해시 구문의 일부이 구문은 루비의 이전 버전에서는 작동하지 않습니다 것을 명심 그래서. 또한 키는 기호가 될 것입니다. 이 두 가지 제약 조건으로 살 수 있다면 새 해시는 이전 해시처럼 작동합니다. 그것들을 변환 할 이유 (아마도 스타일 외에는)가 없습니다.


5
PS : JSON 스타일 이 아니라 JavaScript 스타일입니다. JSON을 사용하려면 키를 인용해야합니다.
mu가 너무 짧습니다.

1

하는 :key => value것은하는 것과 동일하며 key: value실제로는 편리합니다. 를 사용하는 다른 언어는 보지 못했지만 =>Javascript와 같은 다른 언어는 key: valueHash와 동등한 데이터 유형에서를 사용합니다 .

해시를 작성한 방식을 변환하는 보석에 관해서는 현재 프로젝트에서 수행하는 방식을 고수 할 것입니다.

* key: value키를 사용할 때 기호가되고 foo해시의 해당 키에 저장된 값에 액세스하려면 여전히 foo[:key].


Perl과 PHP 모두 =>. 나는 루비, 크게 펄 영감을 받고, :) 펄에서 구문 빌려 추측에는 요
다니엘 Serodio
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.