||之间的区别和|| =在这种情况下

时间:2014-04-07 10:43:38

标签: ruby logical-operators

我很好奇为什么会这样:

user_uid = user[:user_uid] || next_uid

可以返回nil,虽然我认为如果第一个值为nil,它会执行next_uid方法。如果我将||更改为||=,那么如果next_uiduser[: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

2 个答案:

答案 0 :(得分:3)

您正面临这个问题,因为您不会检查store_user方法返回的值,而是user[:user_uid]值(正如@Neil Slater所说)。因此,如果您使用||user[:user_uid]仍为nil。但是,如果您使用||=,则user[:user_uid]设置为next_uid方法返回的值。

答案 1 :(得分: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]