【问题标题】:Modulus in Ruby always returning falseRuby 中的模数总是返回 false
【发布时间】:2014-02-01 07:45:12
【问题描述】:

我需要将以下循环从 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。这使得整个条件毫无意义。

我做错了什么?

【问题讨论】:

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


    【解决方案1】:

    你应该有:

    unless i%2 == 1
    

    或者,等效地:

    if i%2 == 0
    

    意外行为的原因是 Ruby 在条件语句中将除 falsenil 之外的所有值(包括 0)视为“真实”。

    【讨论】:

    • 是的..这就是原因... +1
    【解决方案2】:

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

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

    所以,要检查i 是否偶数,您必须像这样实现您的条件:

    unless i % 2 != 0
      # ...
    

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

    if i.even?
      #...
    

    【讨论】:

      【解决方案3】:

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

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

      if i%2 == 0
      

      而不是你的代码。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2017-07-11
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-07-20
        • 2021-11-05
        相关资源
        最近更新 更多