【问题标题】:Ruby: divisible by 4红宝石:能被 4 整除
【发布时间】:2012-01-11 10:43:35
【问题描述】:

这很好用,但我想让它更漂亮 - 并容纳所有可被 4 整除的值:

if i==4 || i==8 || i==12 || i==16 || i==20 || i==24 || i==28 || i==32
  # ...
end

有什么聪明、简短的方法可以做到这一点?

【问题讨论】:

  • FWIW,除了这个特定问题的正确解决方案之外,当您在同一个对象上有很长的相等比较列表时,您可以将其缩减为 [4, 8, 12].include?(i)

标签: ruby modulo


【解决方案1】:

试试这个:

if i % 4 == 0

这被称为“modulo operator”。

【讨论】:

  • @snowangel:我必须喝完茶。否则我会提前两分钟回答:-)
  • 请注意,如果 i 是像 '8' 这样的字符串,这将默默地失败并返回 '8' 而不是 0。这里没有类型强制。所以请确保 i 是一个整数。
  • @TJChambers:它不会“失败”。 % 运算符对字符串有不同的含义,仅此而已。
  • @SergioTulentsev - 绝对正确 - 所以请确保它不是字符串。
  • @SergioTulentsev - 我的评论来自 Ruby 的直接经验,其中“i”可以是任何对象、字符串、整数等。对于那些可能从其他操作涉及的源检索 i 的人隐式类型强制,此特定操作不会。这是我的意图 - 因为如果我是一个字符串,上面的语句与下一个答案不同,可能不会在操作中返回所需的结果,但不会在运行时导致任何错误来宣布正在对字符串进行操作。这就是非静态类型语言的条件。
【解决方案2】:

还有modulo,可以让你做

420.modulo(4).zero?

% 没有什么能阻止你这样做,但它看起来很奇怪:

420.%(4).zero?

【讨论】:

  • Sergio Tulentsev 的回答是我一直这样做的方式,但我真的更喜欢这个——它更令人赏心悦目!
  • 与上面的答案不同,如果您采用这条路线并且变量不是 Integer 或 Float 子类,您将收到运行时错误。
【解决方案3】:

这总是一个很好的对话开始:

if (i & 3).zero?

【讨论】:

  • 这个答案的年龄和缺乏 cmets 让我发笑:P
  • i.nobits?(3) 在 Ruby 2.5+ 中
猜你喜欢
  • 1970-01-01
  • 2010-09-06
  • 2019-08-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-05-02
  • 1970-01-01
  • 2010-09-09
相关资源
最近更新 更多