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 ?
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 ?
Vous voulez probablement utiliser kind_of()
.
>> s = "something"
=> "something"
>> s.kind_of?(Array)
=> false
>> s = ["something", "else"]
=> ["something", "else"]
>> s.kind_of?(Array)
=> true
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.
@user132447 En fait, Java est sécurisé par les types, donc vous n'avez pas besoin de vous soucier de vérifier les types.
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')
Dans ce cas, je suis sûr que ce sera un tableau. Mais c'est bien de connaître cette méthode aussi. +1
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 ?
Si vous voulez quelque chose de plus proche d'un tableau, vous pouvez vouloir respond_to?(:to_ary)
.
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.
Donc vous dites que si c'est un seul élément, cela en fait un tableau avec un seul élément dedans ?
Oui, et s'il s'agit déjà d'un tableau, il le conserve sans ajouter une deuxième enveloppe de tableau.
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.
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.
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.