我需要将以下循环从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;这使得整个条件毫无意义。
我做错了什么?
答案 0 :(得分:9)
你应该:
unless i%2 == 1
或等同于:
if i%2 == 0
出现意外行为的原因是Ruby会将条件语句中除0
和false
之外的所有值(包括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
而不是你的代码。