7
votes

Y a-t-il un idiome rubis pour apparaître d'éléments d'un tableau alors qu'une condition est vraie

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


2 commentaires

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.


3 Réponses :


7
votes

Peut-être que vous recherchez Take_whrize ? xxx

résultat serait [- 8, -4] .

à Obtenir le résultat d'origine Vous pouvez utiliser drop_whsile à la place. xxx

résultat serait [- 1, -2, 0, 34, 42] dans ce cas.


7 commentaires

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 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]


@ 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.



1
votes

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 }


2 commentaires

Vrai, mais je cherche vraiment quelque chose de plus standard / idiomatique


Il y a les méthodes prenez_whsile et drop_whsile , donc un pop_whsile semble assez comme ça ... j'ai peur qu'il n'y ait pas quelque chose comme ça dans la norme de rubis.



0
votes

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`


0 commentaires