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理解しにくくなります。これは、コードを記述する際の主要な考慮事項です。私たちは、現時点では自分自身と、将来それを維持する人のために、少なくとも 2 人のために書いています。コードは常に意味を成す必要があるため、コードが明確でクリーンであればあるほど、数年後にコードを読んだときに脳にすばやく浸透し、デバッグ時間と将来の作業負荷が削減されます。

于 2013-09-12T19:54:56.470 に答える
0

1 つの式の結果を複数のcase値と比較する必要がある状況向けだと思います。

ここにはいくつかの式がありnumber % 3、 1 つの値number % 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

私は前者の解決策を好みます。より単純で 1 行少ない。

caseps個人的には、無表情の -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

参考までに: 3 番目の条件を最初の条件に移動しました。そうしないと、到達することはありません。

于 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 に答える