Руби Преобразование, если заявления к делу - PullRequest
2 голосов
/ 19 января 2010

Можно ли использовать оператор case для замены этих операторов if?

if (a%3 == 0) then puts "%3"
elsif (a%4 == 0) then puts "%4"
elsif (a%7 == 0 && a%13 == 0) then puts "%%"

Ответы [ 5 ]

6 голосов
/ 19 января 2010
case
  when (a % 3).zero? then puts "%3"
  when (a % 4).zero? then puts "%4"
  when (a % 7).zero? && (a % 13).zero? then puts "%%"
end
3 голосов
/ 19 января 2010

Sure:

case
when (a%3 == 0) then puts "%3"
when (a%4 == 0) then puts "%4"
when (a%7 == 0 && a%13 == 0) then puts "%%"
end

Не намного лучше, правда? ; -)

2 голосов
/ 20 января 2010
puts [3,4,91,10].collect do |a|
 case 0
 when a % 3 then
  "%3"
 when a % 4 then
  "%4"
 when a % 91 then
  "%%"
 end
end

Вы должны быть в состоянии скопировать это право в irb, чтобы увидеть, как оно работает. Пожалуйста, прости небольшой взлом 7 * 13 = 91, но если вы работаете с реальными модулями, они должны быть эквивалентны.

1 голос
/ 20 января 2010

Использование Proc # ===

def multiple_of( factor )
  lambda{ |number| number.modulo( factor ).zero? }
end

case a
  when multiple_of( 3 ): puts( "%3" )
  when multiple_of( 4 ): puts( "%4" )
  when multiple_of( 7*13 ): puts( "%%" )
end
0 голосов
/ 19 января 2010

(a% 7 == 0 && a% 13 == 0) равно (% 7 * 13 == 0).

в ruby, вы можете сделать 1-строчный оператор if-else, используя && и ||.

puts (a%3 == 0)&&"%3"||(a%4 == 0)&&"%4"||(a%(7*13) == 0)&&"%%"||""

или

log = (a%3 == 0)&&"%3"||(a%4 == 0)&&"%4"||(a%(7*13) == 0)&&"%%"
puts log if log

выглядит красиво, но коротко.

...