Y a-t-il un idiome rubis pour apparaître d'éléments d'un tableau pendant qu'une condition est vraie et renvoie la collection?
IE, P>
result = [] while array.last < 0 do result << array.pop end
3 Réponses :
Peut-être que vous recherchez à Obtenir le résultat d'origine Vous pouvez utiliser Take_whrize code > ? résultat code> serait [- 8, -4] code>. p> drop_whsile code> à la place. p> résultat code> serait [- 1, -2, 0, 34, 42] code> dans ce cas. P> p>
Y a-t-il une variante de Take_while qui supprime également les articles de la matrice?
@ComputerLingLinglingLinguist Je ne pense pas malheureusement. J'ai regardé autour des docs et j'ai rien trouvé.
@ComputerLingLingLingLingLingLingLingLingLingLingLingLingLingLo, en utilisant Drop_whIe code> dans le même contexte ci-dessus, retournera votre tableau d'origine avec ces éléments supprimés. C'EST À DIRE. résultat = [-1, -2, 0, 34, 42] code>
@ Ags Merci pour le commentaire, je viens de supposer qu'il voulait un nouveau tableau comme il l'a fait dans la question, mais c'est un bon point s'il veut le dos original, mais ce sera dans l'ordre inverse.
Donc `résultat = tableau.Reverse! .Drop_while {| x | x <0}; Array.Reverse! `est aussi proche que nous pouvons obtenir, non?
@ComputerLinglingLingLingLinguist Oui, je crois. Peut-être que quelqu'un plus intelligent que moi peut trouver une solution cependant :).
N'hésitez pas à mettre à jour votre réponse, mais je soupçonne que cela aussi bon que possible.
Vous pouvez l'écrire vous-même:
class Array
def pop_while(&block)
result = []
while not self.empty? and yield(self.last)
result << self.pop
end
return result
end
end
result = array.pop_while { |i| i < 0 }
Vrai, mais je cherche vraiment quelque chose de plus standard / idiomatique
Il y a les méthodes prenez_whsile code> et drop_whsile code>, donc un pop_whsile code> semble assez comme ça ... j'ai peur qu'il n'y ait pas quelque chose comme ça dans la norme de rubis.
Si vous recherchez une solution pour afficher tous les articles qui satisfont à une condition, envisagez un Sélectionner code> suivi d'un Supprimer_if code>, par exemple x = [*-10..10].sample(10)
# [-9, -2, -8, 0, 7, 9, -1, 10, -10, 3]
neg = x.select {|i| i < 0}
# [-9, -2, -8, -1, -10]
pos = x.delete_if {|i| i < 0}
# [0, 7, 9, 10, 3]
# note that `delete_if` modifies x
# so at this point `pos == x`
Plus générique; Pop Tous les articles correspondants de la fin d'un tableau. Si un article non correspondant est rencontré, arrêtez-vous.
"Ne sautez pas non-correspondant": j'ai du mal à analyser cela.