ruby 代码中的 if a = b 是什么意思?

What the does the line if a = b mean in ruby code?

我试图理解以下代码中的特定行:

def roman_to_integer(roman_string)
   prev = nil
   roman_string.to_s.upcase.split(//).reverse.inject(0) do
    |running_sum, digit|
     if digit_value = DIGITS[digit]
       if prev && prev > digit_value
         running_sum -= digit_value
       else
         running_sum += digit_value
       end
       prev = digit_value
     end
     running_sum
   end
 end

谁能帮我理解 if digit_value = DIGITS[digit] 这一行的意思?我们是否将散列中与键 'DIGIT' 相对应的值分配给此处的 digit_value?

are we assigning the value

是的,我们是。我们还检查操作的真实性。赋值运算符 returns 分配的值。现在,如果它是一个数字,它将是一个真实的结果并且控制将输入 if

如果DIGITS[digit] returns为nil或false,则将赋值给digit_value,同时也成为赋值操作的结果。这些值是假的,所以我们会输入 else,如果那里有的话。但是我们没有,所以我们直接跳过 if.

if digit_value = DIGITS[digit] 将 return 为真 if DIGITS[digit] 的值不同于 nilfalse。这是因为在 Ruby 中 nil 和 false 是唯一被认为是 falsy 的值。

Ruby 将首先将值赋给变量,然后评估该值是否为假。

are we assigning the value corresponding to the key 'DIGIT' from the hash to the digit_value here?

是的,这正是正在发生的事情。临时变量比从散列中提取更容易阅读。在类似的情况下,获取值的成本可能更高(例如考虑读取数据库而不是哈希查找),因此进入该实践并不是一个坏习惯。

赋值运算符也returns为if语句分配的值起作用。

替代等效语法有点冗长:

digit_value = DIGITS[digit]
if digit_value
  # .... etc

所以这也是给变量赋值并想立即检查其真实性时的常见样式选择。