0

我试图在代码中执行以下操作,但不确定如何在大小写时使用模数

(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

4 回答 4

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变得不太容易理解,这是我们编写代码时的首要考虑因素。我们为至少两个人写作,现在是我们自己,也是为将来维护它的人写作。它需要在任何时候都有意义,所以代码越明显和干净,它在几年内阅读时进入大脑的速度就越快,从而减少调试时间和未来你的工作量。

于 2013-09-12T19:54:56.470 回答
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

我更喜欢前一种解决方案。更直接,更少一行。

ps 我个人认为无表情case的-s很丑:)

于 2017-03-24T09:22:53.543 回答
-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

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

于 2013-09-12T19:31:01.643 回答
-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
于 2013-09-12T19:45:47.650 回答