301 votes

Ruby - test pour les tableaux

Quelle est la bonne façon de :

is_array("something") # => false         (or 1)

is_array(["something", "else"]) # => true  (or > 1)

ou pour obtenir le nombre d'éléments qu'il contient ?

7 votes

Voulez-vous un tableau réel, ou juste quelque chose qui ressemble à un tableau ?

1 votes

Il n'y a pas de sécurité de type en Ruby. Ne vous préoccupez pas de savoir si votre variable est un tableau ou non. La méthode devrait supposer que c'est le cas, et appeler count sur cette variable : mon_tableau.count

0 votes

Veuillez lire les réponses de zgchurch et DigitalRoss pour un Ruby plus idiomatique.

577voto

ry. Points 3841

Vous voulez probablement utiliser kind_of() .

>> s = "something"
=> "something"
>> s.kind_of?(Array)
=> false
>> s = ["something", "else"]
=> ["something", "else"]
>> s.kind_of?(Array)
=> true

46 votes

Il y a aussi is_a? y instance_of? . Voir stackoverflow.com/questions/3893278/

2 votes

La vérification de type est pour Java. Allez-y et appelez simplement count sur la variable. Écrivez des tests unitaires pour vous assurer que la méthode fonctionne comme prévu.

17 votes

@user132447 En fait, Java est sécurisé par les types, donc vous n'avez pas besoin de vous soucier de vérifier les types.

159voto

zgchurch Points 1231

Tu es sûr que c'est besoins pour être un tableau ? Vous pouvez utiliser respond_to?(method) Votre code fonctionnerait donc pour des choses similaires qui ne sont pas nécessairement des tableaux (peut-être une autre chose dénombrable). Si vous avez réellement besoin d'un array puis le post décrivant le Array#kind\_of? est la meilleure méthode.

['hello'].respond_to?('each')

1 votes

Dans ce cas, je suis sûr que ce sera un tableau. Mais c'est bien de connaître cette méthode aussi. +1

0 votes

Idée intéressante, j'utilise le push/pop sur une structure de données. Est-ce que d'autres éléments que les tableaux répondraient à ces méthodes ?

3 votes

Si vous voulez quelque chose de plus proche d'un tableau, vous pouvez vouloir respond_to?(:to_ary) .

63voto

DigitalRoss Points 80400

Au lieu de tester pour un Array, convertissez juste tout ce que vous obtenez en un niveau Array, donc votre code ne doit gérer que le seul cas.

t = [*something]     # or...
t = Array(something) # or...
def f *x
    ...
end

Ruby a plusieurs façons d'harmoniser une API qui peut prendre un objet ou un tableau d'objets, donc, en devinant pourquoi vous voulez savoir si quelque chose es un Array, j'ai une suggestion.

El splat L'opérateur contient beaucoup de magie que vous pouvez consulter, ou vous pouvez simplement appeler Array(something) qui ajoutera un wrapper Array si nécessaire. C'est similaire à [*something] dans ce seul cas.

def f x
  p Array(x).inspect
  p [*x].inspect
end
f 1         # => "[1]"
f [1]       # => "[1]"
f [1,2]     # => "[1, 2]"

Ou bien, vous pouvez utiliser le splat dans la déclaration du paramètre et ensuite .flatten ce qui vous donne un autre type de collecteur. (D'ailleurs, vous pourriez appeler .flatten ci-dessus, également).

def f *x
  p x.flatten.inspect
end         # => nil
f 1         # => "[1]"
f 1,2       # => "[1, 2]"
f [1]       # => "[1]"
f [1,2]     # => "[1, 2]"
f [1,2],3,4 # => "[1, 2, 3, 4]"

Et, merci gregschlom il est parfois plus rapide d'utiliser simplement Array(x) parce que quand c'est déjà un Array il n'est pas nécessaire de créer un nouvel objet.

0 votes

Donc vous dites que si c'est un seul élément, cela en fait un tableau avec un seul élément dedans ?

0 votes

Oui, et s'il s'agit déjà d'un tableau, il le conserve sans ajouter une deuxième enveloppe de tableau.

2 votes

N'oubliez pas : [*nil] => [] . Vous risquez donc de vous retrouver avec un tableau vide.

19voto

Peter Points 38320

On dirait que vous cherchez quelque chose qui a un certain concept d'articles. Je recommanderais donc de voir si c'est Enumerable . Cela garantit également l'existence #count .

Par exemple,

[1,2,3].is_a? Enumerable
[1,2,3].count

Notez que, si size , length y count tous les travaux pour les tableaux, count est le bon sens ici - (par exemple, 'abc'.length y 'abc'.size Les deux fonctionnent, mais 'abc'.count ne fonctionne pas comme ça).

Attention : une chaîne de caractères est_a ? Enumérable, donc peut-être que ce n'est pas ce que vous voulez... cela dépend de votre concept d'un tableau comme d'un objet.

11voto

Lucas Jones Points 11741

Essayez :

def is_array(a)
    a.class == Array
end

EDIT : L'autre réponse est bien meilleure que la mienne.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X