我试图在代码中执行以下操作,并且不确定如何在
时使用模数(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
我知道我只是缺少一些愚蠢的东西,但不知道那是什么。
编辑:只需将其更改为必须如何工作。
答案 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 % 3
,number % 5
和number % 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