Ruby:能被4整除

33
这个代码可以正常运作,但我希望让它看起来更漂亮,并且适用于所有能被4整除的值:
if i==4 || i==8 || i==12 || i==16 || i==20 || i==24 || i==28 || i==32
  # ...
end

有没有巧妙而简短的方法来做到这一点?


9
顺便提一下,针对这个具体问题的正确解决方案不在此讨论,当你需要对同一个对象进行长列表的相等比较时,可以简化为[4, 8, 12].include?(i) - d11wtq
3个回答

147

12
@snowangel说:“我得先把茶喝完才能回答,不然我就会比现在早两分钟回答了 :-)” - Sergio Tulentsev
2
请注意,如果 i 是一个字符串,比如 '8',这将会悄悄失败并返回 '8' 而不是 0。这里没有进行任何类型强制转换。因此,请确保 i 是一个整数。 - TJChambers
1
@TJChambers:它不会“失败”。%运算符在字符串上有不同的含义,仅此而已。 - Sergio Tulentsev
@SergioTulentsev - 完全正确 - 所以确保它不是一个字符串。 - TJChambers
@TJChambers:你知道这不是JavaScript。我们通常不会混合使用类型。此外,页面上没有提到字符串。所以我很困惑,不知道是什么促使你发表评论的。 :) - Sergio Tulentsev
1
@SergioTulentsev - 我的评论来自于我在Ruby中的直接经验,其中“i”可以是任何对象,字符串,整数等。对于那些从其他操作涉及隐式类型转换的源中检索i的人,这个特定的操作不会发生。这就是我的意图-因为如果i是一个字符串,上面的语句不像下一个答案那样返回期望的结果,但不会在运行时导致任何错误来宣布正在操作一个字符串。这就是非静态类型语言的情况。 - TJChambers

51

此外还有模运算,它可以让你进行

420.modulo(4).zero?

你可以使用%来实现,但这看起来很奇怪:

420.%(4).zero?

1
Sergio Tulentsev的回答是我一直以来的做法,但我真的更喜欢这个--它看起来更加舒适! - Matthew Clark
2
与上面的答案不同,如果您采用这种方法并且变量不是整数或浮点数子类,则会出现运行时错误。 - TJChambers

15

这总是一个好的话题开端:

if (i & 3).zero?

14
这个回答的老旧和缺乏评论让我笑了 :P - Abram
2
i.nobits?(3) in Ruby 2.5+ - Stefan

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接