2014-04-07 367 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]