我正在尝试理解以下代码中的特定行:
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?
答案 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]
的值不是nil
或false
。这是因为在Ruby中,nil和false是唯一被认为是伪造的值。
Ruby首先将值赋给变量,然后评估该值是否为假。