답변:
예, 차이가 있습니다. 다음은 합법적입니다.
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[:s] = 42
예제가이 질문과 관련이 있다고 생각하는 이유는 무엇 입니까? 제 생각에는 JavaScript 스타일과 해시 로켓 스타일은 해시 키 / 값 쌍 정의에만 관련이 있으며 키로 해시 요소를 처리하는 것과는 관련이 없습니다. 따라서이 h[s:] = 42
예는 오해의 소지가있는 것 같습니다.
h[:s] = 42
표기법을 사용 합니다. 다른 옵션은 없습니다. 키 / 값 쌍을 정의 할 때 { key: value }
JavaScript 스타일 또는 { :key => value }
해시 로켓 스타일 옵션이 있습니다 . 주소 지정 시나리오는 여전히 초점이 맞춰진 항목과 관련이없는 것 같습니다.
해시 로켓에 의해 할당 된 루비 해시 키는 키-값 쌍 ( 예 : . 's' => x
)에 대한 문자열을 용이하게 할 수 있지만 기호 ( 예 : key: "value"
또는 :key => "value"
) 를 통한 키 할당 은 문자열로 할당 될 수 없습니다. 해시 로켓이 해시 테이블에 대한 자유와 기능을 제공하고, 특히 문자열을 키로 허용 하지만 응용 프로그램 성능은 해시 키로 기호를 사용하여 해시 테이블을 구성하는 경우보다 느릴 수 있습니다. 다음 리소스를 통해 해시 로켓과 기호 간의 차이점을 명확히 할 수 있습니다.
key: value
JSON 스타일의 과제는 새로운 루비 1.9 해시 구문의 일부이 구문은 루비의 이전 버전에서는 작동하지 않습니다 것을 명심 그래서. 또한 키는 기호가 될 것입니다. 이 두 가지 제약 조건으로 살 수 있다면 새 해시는 이전 해시처럼 작동합니다. 그것들을 변환 할 이유 (아마도 스타일 외에는)가 없습니다.
하는 :key => value
것은하는 것과 동일하며 key: value
실제로는 편리합니다. 를 사용하는 다른 언어는 보지 못했지만 =>
Javascript와 같은 다른 언어는 key: value
Hash와 동등한 데이터 유형에서를 사용합니다 .
해시를 작성한 방식을 변환하는 보석에 관해서는 현재 프로젝트에서 수행하는 방식을 고수 할 것입니다.
* key: value
키를 사용할 때 기호가되고 foo
해시의 해당 키에 저장된 값에 액세스하려면 여전히 foo[:key]
.
=>
. 나는 루비, 크게 펄 영감을 받고, :) 펄에서 구문 빌려 추측에는 요
h = { 'a.b': 'c' }
이제 Ruby 2.2.0부터 합법적입니다. 참조 bugs.ruby-lang.org/issues/4276