0
votes

Comment réparer la fin de la saisie avec deux déclarations booléennes

Je filtrant des éléments de tableau en rubis et je veux filtrer les positifs, seulement s'ils sont tous des entiers.

l = [1,2,'a','b']

l.select do |number|
  new_array = [] 
  new_array.push(number) if number.positive? && number.kind_of? Integer
end


0 commentaires

3 Réponses :


0
votes

entourez entre parenthèses: xxx pré>

qui donne lieu dans méthode non définie "positive?" Pour "A": chaîne code> parce que positif? code> n'est pas défini pour les chaînes 'a' code> et 'b' code>.

Vérification du type d'abord fonctionne: P>

new_array.push(number) if (number.kind_of? Integer) && number.positive?


1 commentaires

Ajouter les parens à l'appel de la méthode? numéro.kind_of? (Entier)



2
votes

La méthode SELECT est une méthode de filtrage et nécessite une valeur booléenne décrivant si l'élément doit ou ne doit pas être dans la sortie résultante. Dans ce bloc, vous devriez vous concentrer sur une chose et une chose seulement: décrivant en termes minimaux les critères d'acceptation pour le filtre .

Ce que vous faites ici est de déclarer une variable locale, de la population conditionnelle , puis jetant la jeter et jetant aussi la sortie résultante.

Ce que vous voulez vraiment, c'est de le dépouiller sur les bases: xxx

Don ' t oublier de capturer le résultat de cette opération ou il va directement dans la corbeille.

Il y a toujours un bug ici car les chaînes n'ont pas de positif? méthode, donc juste inversement La commande: xxx

qui nécessite d'ajouter des supports au kind_of? appelez pour éviter toute ambiguïté. && est un opérateur très agressif et interprétera l'appel comme ceci s'il n'est pas correctement contenu: xxx


0 commentaires

0
votes

juste à côté de la curiosité, la correction de singe Object Code> Classe: XXX Pré>

Pour l'utilisation de ce type, avec Array # Garder #IF : p>

l.keep_if(&:integer_and_positive?)
#=> [1, 2]


0 commentaires