Ruby中的模数总是返回false

时间:2014-01-13 14:14:58

标签: javascript ruby-on-rails ruby code-translation

我需要将以下循环从JavaScript“转换”为Ruby:

for(i=0;i<=b.length-1;i++){
  if(!(i%2)){
    c+=b[i]
  }
}

以下是我尝试在Ruby中编写相同内容的方法:

until i == b.length-1 do
  unless i%2 == true
    c += b[i]
    i += 1
  end  
end

然而,Ruby中的模数运算符似乎总是返回false;这使得整个条件毫无意义。

我做错了什么?

3 个答案:

答案 0 :(得分:9)

你应该:

unless i%2 == 1

或等同于:

if i%2 == 0

出现意外行为的原因是Ruby会将条件语句中除0false之外的所有值(包括nil)视为“truthy”。

答案 1 :(得分:5)

在JavaScript和Ruby中,modulus operator都应该返回一个不是布尔值的整数:

2 % 2 
# => 0
3 % 2
# => 1

因此,要检查i是否均匀,您必须实现以下条件:

unless i % 2 != 0
  # ...

但是,出于此目的,我认为最好使用其中一种方法Integer#even?Integer#odd?

if i.even?
  #...

答案 2 :(得分:2)

在Javascript中,0-0是假值,因此在进行比较时会评估为false。所有其他Number评估为true

在Ruby中,比较对象时没有隐式类型转换,0求值为true。如果你想在Ruby中进行比较,你应该使用

if i%2 == 0

而不是你的代码。