2010-01-19 6 views
2

Est-il possible d'utiliser une instruction case pour remplacer ces instructions if?Ruby Convertir les instructions If en cas

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

Peut-être, mais il ne sera pas plus lisible. Pourquoi voulez-vous? –

Répondre

6
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 
+0

ce n'est pas correct, il va imprimer «Nil» quand il ne tombe pas dans l'une de ces conditions, ce qui n'est pas le code original. – Verhogen

+0

Vous avez raison. Il suffit de déplacer les puts dans la déclaration de cas. J'ai changé la réponse en conséquence. –

3

Bien sûr:

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 

Il est pas beaucoup mieux, est-il? ;-)

+0

Je pense qu'il est, légèrement = p – Verhogen

0

(en% 7 == 0 & & de% 13 == 0) est égale à (a * 7% 13 == 0).

dans ruby, vous pouvez faire une instruction if-else sur une ligne, utiliser & & et ||.

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

ou

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

son look Agly mais court.

2
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 

Vous devriez pouvoir copier ce droit dans irb pour le voir fonctionner. S'il vous plaît pardonner le léger 7 * 13 = 91 hack, mais si vous travaillez avec des modulos réels, ils devraient être équivalents.

1

utilisant 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 
Questions connexes