2013-04-06 5 views
0

빠른 질문, 왜이 작동하지 않습니다? 루비 구문 설탕 추가 메서드

sum = {} 
e = "a" 
(sum[e] ||= 0) += 1 

나는 ( 1 기대) 가지고 : 당신이 (sum[e] ||= 0)을 수행 할 때

SyntaxError: unexpected tOP_ASGN, expecting $end 
(sum[e] ||= 0) += 1 

답변

2

괄호가 식을 평가하도록합니다. 결과적으로 sum[e] (예 : 0)의 값으로 계산되어 += 작업을 수행 할 수 없습니다. 예상대로 우변 값/sum[e]에 대한 참조를 반환하지 않습니다. 이 같은

irb(main):001:0> 0 += 1 
SyntaxError: (irb):1: syntax error, unexpected tOP_ASGN, expecting $end 

심지어 뭔가 :

irb(main):004:0> (sum[e]) += 1 
SyntaxError: (irb):4: syntax error, unexpected tOP_ASGN, expecting $end 

어떤 이유로 당신이 그것을 유지하려면

당신은 결과 일 것입니다 무슨에 동일한 작업을 수행하여이를 확인할 수 있습니다 한 줄이면 다음과 같이 할 수 있습니다.

dbenhur가 언급했듯이, 당신이 그것을 액세스 할 때마다 키가 자동으로 0으로 설정 해시를 할

sum = Hash.new(0) 

을 설정 합이 많은 일, 당신은 또한 해시의 모든 키에 대한 기본 값을 설정할 수 있습니다.

+0

쿨, 편집 해 주셔서 감사합니다. 문법적으로 유지하는 방법을 알고 있다면 물어볼 것입니다. – Hartator

+0

@Hartator 물론 문제 없습니다. 다행이라고 생각합니다. 기회가 생길 때 그것을 정확하게 표시하십시오. –

+0

또한 해시가 정의되지 않은 키에 대해 [블록 초기화] (http://www.ruby-doc.org/core-2.0/Hash.html#method-c-new)를 가질 수 있습니다 :'sum = Hash.new {| h, k | k [k] = 0}' – dbenhur