2014-04-07 12 views
0

에서 나는 이런 일이 왜 궁금 해요 :사이의 차이 || 및 || =이 상황

user_uid = user[:user_uid] || next_uid 

nil 반환 할 수 있습니다, 내가 처음 값이 nil이 경우, 그것은 next_uid 메소드를 실행 생각하지만. 내가 ||=||를 변경하는 경우, 다음은하지 않는 다음과 같은 동안 그래서 질문은, 왜

user_uid = user[:user_uid] ||= next_uid 

||= 연산자를 필요로하지됩니다 nil

입니다 next_uiduser[:user_uid] 경우의 결과를 반환?

@terms_accepted = options[:terms_accepted] || false 

관련 코드 : 문제

def insert(user) 
     store_user(user) 
    end 

    def get(user_uid) 
     #validations 

     users[user_uid] 
    end 

    private 

    def store_user(user) 
     user_uid = user[:user_uid] || next_uid 

     users[user_uid] = user 

     return user_uid 
    end 

    def next_uid 
     @memory[:user_uid] ||= 0 
     "#{@memory[:user_uid] += 1}" 
    end 

테스트 코드 :

it "stores users" do 
    user = { 
    :user_uid => nil 
    } 
    uid = subject.insert(user) 

    assert_user_was_stored(uid) 
end 

def assert_user_was_stored(expected_uid) 
    result = subject.get(expected_uid) 

    assert_equal expected_uid, result[:user_uid] 
end 
+0

무엇이 문제입니까? –

+0

당신이'next_uid' 코드를 제공하면 도움이 될 것이라고 생각합니다. – xlembouras

+1

답변은 이렇습니다 : 그렇지 않습니다. 뭔가를 엉망으로 만들었어야합니다. –

답변

3

당신이 값에서 반환 된 체크하지 않는 becuase 당신은이 문제에 직면 해 store_user 방법이지만, user[:user_uid] 값 (정확하게 @Neil Slater가 말한 것). 따라서 ||을 사용하는 경우 은 nil으로 남습니다. 그러나 ||=을 사용하는 경우 user[:user_uid]next_uid 메서드에서 반환되는 값으로 설정됩니다.

+0

당신은 어떻게 의미합니까? 'uid = subject.insert_user'는'assert_user_was_stored'에서 내가 사용하는 uid를 'store_user'가 반환하는'next_uid '를 통해 생성 된 uid와 동일하게 설정합니다. – dax

+0

@dax 당신은'assert_equal expected_uid, result [: user_uid]'를 가지고 있고,'result'는'get' 메쏘드에서 리턴되고 따라서'user [user_uid]'값입니다. –

+0

그렇지 않습니다.'get'은 키가'user_uid' 인'users' 해시 값을 반환합니다. 또한, 테스트 섹션에서 명확성을 위해 편집했는데, 혼란이 있다면 미안 해요! – dax

0

문제는 내가 한 번에 두 개의 값 - user_uiduser[:user_uid]을 지정하지 않은 경우입니다. 더 좋은 방법은이 두 줄을 만드는 것입니다.

# first set the value of user[:user_uid] if it is nil 
user[:user_uid] ||= next_uid 

# then set the value of the local variable 
user_uid = user[:user_uid]