如果a = b在红宝石代码中的含义是什么?

时间:2016-09-02 15:17:26

标签: ruby if-statement variable-assignment

我正在尝试理解以下代码中的特定行:

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

有人可以帮我理解,如果digit_value = DIGITS [数字]是什么意思?我们是否正在分配与键“DIGIT”相对应的值?从hash到digit_value?

3 个答案:

答案 0 :(得分:2)

  

我们分配值

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

如果DIGITS[digit]返回nil或false,它将被分配给digit_value,并且它也将成为赋值操作的结果。这些值是假的,所以我们输入else,如果我们有一个。但我们没有,所以我们只是跳过if

答案 1 :(得分:2)

  

我们是否将对应于键'DIGIT'的值从哈希值分配给digit_value?

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

赋值运算符还返回为if语句指定的值。

替代等效语法有点冗长:

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

因此,在为变量赋值并希望立即检查其真实性时,这也是一种常见的样式选择。

答案 2 :(得分:0)

if digit_value = DIGITS[digit]将返回true if DIGITS[digit]的值不是nilfalse。这是因为在Ruby中,nil和false是唯一被认为是伪造的值。

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