309 Stimmen

Ruby - Test für Array

Was ist der richtige Weg zu:

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

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

oder um die Anzahl der darin enthaltenen Elemente zu ermitteln?

588voto

ry. Punkte 7745

Sie möchten wahrscheinlich kind_of() .

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

160voto

zgchurch Punkte 2302

Sind Sie sicher, dass es braucht ein Array zu sein? Vielleicht können Sie Folgendes verwenden respond_to?(method) so dass Ihr Code würde für ähnliche Dinge, die nicht unbedingt Arrays (vielleicht einige andere enumberable Sache) funktionieren. Wenn Sie tatsächlich eine array dann den Beitrag mit der Beschreibung der Array#kind\_of? Methode ist am besten.

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

63voto

DigitalRoss Punkte 138823

Statt einer Prüfung auf eine Array, wandeln Sie einfach alles, was Sie bekommen, in eine einstufige Array, Ihr Code muss also nur diesen einen Fall behandeln.

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

Ruby hat verschiedene Möglichkeiten, eine API zu harmonisieren, die ein Objekt oder ein Array von Objekten nehmen kann, so dass, eine Vermutung, warum Sie wissen wollen, ob etwas ist ein Array, habe ich einen Vorschlag.

El splat Operator enthält eine Menge Magie können Sie nachschlagen, oder Sie können einfach aufrufen Array(something) die bei Bedarf einen Array-Wrapper hinzufügt. Es ist ähnlich wie bei [*something] in diesem einen Fall.

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

Oder Sie können die Funktion splat in der Parameterdeklaration und dann .flatten Damit haben Sie eine andere Art von Sammler. (Im Übrigen könnten Sie .flatten auch oben).

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

Und, danke gregschlom ist es manchmal schneller, einfach die Funktion Array(x) denn wenn es bereits ein Array braucht es kein neues Objekt zu erstellen.

41voto

dipole_moment Punkte 4156

[1,2,3].is_a? Array wird als wahr ausgewertet.

19voto

Peter Punkte 120325

Es klingt, als ob Sie etwas suchen, das ein Konzept von Gegenständen hat. Ich würde daher empfehlen, zu prüfen, ob es sich um Enumerable . Das garantiert auch die Existenz von #count .

Zum Beispiel,

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

beachten Sie, dass, während size , length y count funktionieren alle für Arrays, count ist hier die richtige Bedeutung - (zum Beispiel, 'abc'.length y 'abc'.size beide funktionieren, aber 'abc'.count funktioniert so nicht).

Vorsicht: eine Zeichenkette is_a? Enumerable, so vielleicht ist dies nicht, was Sie wollen... hängt von Ihrem Konzept eines Arrays wie Objekt.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X