2010-06-04 7 views
2

J'ai deux fonctions successives avec le même état et je me demande quelle est la meilleure façon d'écrire cela? Je sais que la seule façon de faire cela est d'utiliser if (condition) ... end, mais je me demande si je peux le faire en une ligne similaire à bash, '[$ n == $ value] echo "$ n "& & pause".Comment exécuter plusieurs fonctions successives sur 1 ligne dans Ruby?

n = 0 
loop do 
    puts n if n == value # puts and break is having the same condition, but 
    break if n == value # can we do it in one line? 
    n += 1 
end 
+0

Vous pouvez le faire en une ligne comme vous l'avez montré, mais je dirais que la meilleure façon de l'écrire est sur plusieurs lignes. –

Répondre

1

Un moyen facile est de simplement parenthésée les déclarations:

ruby-1.9.1-p378 > 0.upto(5) do |n| 
ruby-1.9.1-p378 >  (puts n; break;) if n == 3 
ruby-1.9.1-p378 ?> puts ">>#{n}<<" 
ruby-1.9.1-p378 ?> end 
>>0<< 
>>1<< 
>>2<< 
3 

Si c'est un peu beaucoup à mettre entre parenthèses, un début de fin fera l'affaire:

0.upto(5) do |n| 
    begin 
     puts "I found a matching n!" 
     puts n 
     puts "And if you multiply it by 10, it is #{10*n}" 
     break; 
    end if n == 3 
    puts "((#{n}))" 
end 

Sortie:

 
((0)) 
((1)) 
((2)) 
I found a matching n! 
3 
And if you multiply it by 10, it is 30 
+0

C'est incroyable, merci pour votre réponse perspicace! –

4

Parce que n est vrai, vous pouvez utiliser le 'et' menuisier. Il se lit vraiment bien:

n = 0 
loop do 
    puts n and break if n == value 
    n += 1 
end 

--edit--

Comme indiqué dans les commentaires, qui ne fonctionne pas en réalité parce que met le rendement nul, ce qui est pas truthy. Ma faute. Vous pouvez utiliser 'ou' à la place, mais cela ne se lit pas bien. Donc, je dirais juste de grouper les déclarations avec des parenthèses.

n = 0 
loop do 
    (puts n; break) if n == value 
    n += 1 
end 

Vous pouvez également changer la méthode met pour renvoyer la valeur qu'il imprime, et travaillerait avec « et », mais ce qui est sans doute pas le plus intelligent idée :)

Je devine que votre code réel est différent de ce que vous avez collé, donc si la première méthode de votre chaîne renvoie quelque chose, vous pouvez utiliser 'et'.

+0

Je l'ai essayé, et il boucle continuellement et l'instruction break n'est pas exécutée. –

+0

Intéressant est que dans ce cas 'et' se comporte différemment alors' && '. Probablement une certaine priorité d'opérateur? Quelqu'un peut-il clarifier? –

+0

Oh, mon mauvais. met les rendements nuls, donc vous ne pouvez pas utiliser 'et'.Vous devez utiliser 'ou', qui ne se lit pas aussi bien. – zaius

0

proc { puts n; break; }.() if n == 3

0

L'une des règles d'or de Ruby est que si vous écrivez une boucle, vous faites probablement mal. Dans ce cas particulier, tout ce que fait votre boucle est de trouver un élément dans une collection. Dans Ruby, il existe déjà une méthode pour trouver un élément dans une collection: Enumerable#find. Il n'y a pas besoin d'écrire le vôtre.

Ainsi, le code est simplifié à:

puts (0...1.0/0).find {|n| n == value } 

Maintenant que nous avons une belle formulation déclarative du problème, il est facile de voir que (en supposant la sémantique d'égalité sain d'esprit et sémantique sain d'esprit de value.to_s), ce est exactement le même que:

puts value 

Donc, toute la boucle était complètement inutile pour commencer.

Questions connexes