我很好奇为什么会这样:
user_uid = user[:user_uid] || next_uid
可以返回nil
,虽然我认为如果第一个值为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 :(得分:3)
您正面临这个问题,因为您不会检查store_user
方法返回的值,而是user[:user_uid]
值(正如@Neil Slater所说)。因此,如果您使用||
,user[:user_uid]
仍为nil
。但是,如果您使用||=
,则user[:user_uid]
设置为next_uid
方法返回的值。
答案 1 :(得分:0)
问题是我一次分配了两个值 - user_uid
和user[: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]