2014-04-07 75 views
0

我很好奇,爲什麼發生這種情況:和|| =在這種情況下

user_uid = user[:user_uid] || next_uid 

可以返回nil,但我認爲如果第一個值是零,它執行next_uid方法。如果我改變||||=,則返回的next_uid如果user[:user_uid]nil

所以現在的問題是,爲什麼

user_uid = user[:user_uid] ||= next_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

你面臨這個問題監守你不檢查從返回的值store_user方法,但是user[:user_uid]值(正如@Neil Slater所說)。所以,如果您使用||user[:user_uid]仍然是nil。但是如果您使用||=,user[:user_uid]設置爲由next_uid方法返回的值。

+0

你是什麼意思? 'uid = subject.insert_user'通過'store_user'返回的'next_uid'設置我在'assert_user_was_stored'中使用的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]