在ruby情况下的模数运算符

时间:2013-09-12 19:26:03

标签: ruby case modulus

我试图在代码中执行以下操作,并且不确定如何在

时使用模数
(1..100).each do |number|
  case number
    when % 3 and % 5
      puts "Hello World"
    when % 3
      puts "Hello"
    when % 5
      puts "World"
    else
      puts number
   end
end

我知道我只是缺少一些愚蠢的东西,但不知道那是什么。

编辑:只需将其更改为必须如何工作。

4 个答案:

答案 0 :(得分:1)

我可能会写这样的东西。这是一个老派的事情:

(1..15).each do |number|
  case
  when (number % 3 == 0) && (number % 5 == 0)
    puts "(#{ number }) Hello World"
  when (number % 3 == 0)
    puts "(#{ number }) Hello"
  when (number % 5 == 0)
    puts "(#{ number }) World"
  else
    puts number
  end
end

# >> 1
# >> 2
# >> (3) Hello
# >> 4
# >> (5) World
# >> (6) Hello
# >> 7
# >> 8
# >> (9) Hello
# >> (10) World
# >> 11
# >> (12) Hello
# >> 13
# >> 14
# >> (15) Hello World

以下是我的写作方式:

(1..15).each do |number|
  val = case
        when (number % 3 == 0) && (number % 5 == 0)
          "Hello World"
        when (number % 3 == 0)
          "Hello"
        when (number % 5 == 0)
          "World"
        else
          number
        end

  puts val
end

这更清洁,更具可读性。虽然可以使用case 0,但每个when的测试变得不那么容易理解,这是我们编写代码时的首要考虑因素。我们现在至少为两个人写作,以及为将来维护它的人。它需要在任何时候都有意义,因此代码越明显越干净,在几年内读取它就会越快进入大脑,从而减少调试时间和未来的工作量。

答案 1 :(得分:0)

我相信case适用于需要将一个表达式的结果与多个值进行比较的情况。

这里有几个表达式number % 3number % 5number % 15与一个值0进行比较。我建议在这里使用if-elsif-else

if number % 15 == 0
  puts 'Hello World'
elsif number % 3 == 0
  puts 'Hello'
elsif number % 5 == 0
  puts 'World'
else
  puts number
end

或者考虑颠倒这种比较的想法并使0表达式本身:

case 0
when number % 15
  puts "Hello World"
when number % 3
  puts "Hello"
when number % 5
  puts "World"
else
  puts number
end

我更喜欢以前的解决方案。更简单,更少一行。

P.S。我个人认为无表情case - s很难看:)

答案 2 :(得分:-1)

以下内容可行:

(1..15).each do |number|
  case 0
    when number%3 + number%5
      puts "Hello World"
    when number % 3
      puts "Hello"
    when number % 5
      puts "World"
    else
      puts number
   end
end

# >> 1
# >> 2
# >> Hello
# >> 4
# ...
# >> 13
# >> 14
# >> Hello World

仅供参考:将第三个条件移至第一个 - 否则永远不会达到。

答案 3 :(得分:-2)

(1..100).each do |number|
  puts case number
  when ->x{x.%(3).zero? and x.%(5).zero?}
    "Hello World"
  when ->x{x.%(3).zero?}
    "Hello"
  when ->x{x.%(5).zero?}
    "World"
  else
    number
  end
end