正しい方法は何ですか:
is_array("something") # => false (or 1)
is_array(["something", "else"]) # => true (or > 1)
またはその中のアイテムの数を取得するには?
正しい方法は何ですか:
is_array("something") # => false (or 1)
is_array(["something", "else"]) # => true (or > 1)
またはその中のアイテムの数を取得するには?
回答:
あなたはおそらく使いたいでしょうkind_of()
。
>> s = "something"
=> "something"
>> s.kind_of?(Array)
=> false
>> s = ["something", "else"]
=> ["something", "else"]
>> s.kind_of?(Array)
=> true
kind_of?()
他のソリューションよりも使いたいのですか?他の人に対するあなたの答えの利点に関するいくつかの説明は、将来の読者にとって役立つでしょう。
配列である必要がありますか?あなたはrespond_to?(method)
あなたのコードが必ずしも配列ではない(おそらく他のenumberableなものである)類似したもののために機能するように使うことができるかもしれません。実際にが必要な場合はarray
、Array#kind\_of?
メソッドを説明する投稿が最適です。
['hello'].respond_to?('each')
respond_to?(:to_ary)
。
Array,
1レベルに変換したものを単にテストする代わりにArray,
、コードは1つのケースのみを処理する必要があります。
t = [*something] # or...
t = Array(something) # or...
def f *x
...
end
Rubyには、オブジェクトまたはオブジェクトの配列を取ることができるAPIを調和させるさまざまな方法があります。そのため、何かが配列であるかどうかを知りたい理由を推測して、私は提案します。
スプラットのオペレータは、魔法の多くが含まれていますが、調べることができます、またはあなただけ呼び出すことができArray(something)
、必要に応じて配列ラッパーを追加しますました。これ[*something]
は、この1つの場合と同様です。
def f x
p Array(x).inspect
p [*x].inspect
end
f 1 # => "[1]"
f [1] # => "[1]"
f [1,2] # => "[1, 2]"
または、パラメーター宣言でスプラットを使用してから.flatten
、別の種類のコレクターを提供することもできます。(さらに言えば、.flatten
上記も呼び出すことができます。)
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]"
そして、gregschlomのおかげでArray(x)
、Array
それがすでにある場合は新しいオブジェクトを作成する必要がないため、使用するだけで高速になることがあります。
[*nil] => []
。したがって、空の配列になる可能性があります。
Array(foo)
がはるかに効率的[*foo]
[1,2,3].is_a? Array
trueと評価されます。
is_a?
このスレッド全体を参照する簡潔な答えはありません。最も近いのは[1,2,3].is_a? Enumerable
です。私はまだこの答えを持つ価値があると思います。
アイテムのコンセプトがあるものを求めているようですね。したがって、そうであるかどうかを確認することをお勧めしEnumerable
ます。それはの存在も保証し#count
ます。
例えば、
[1,2,3].is_a? Enumerable
[1,2,3].count
一方で、それを注意しsize
、length
そしてcount
配列のためのすべての作業は、count
(例えば、 -ここでは、右の意味である'abc'.length
と'abc'.size
の両方の仕事は、しかし、'abc'.count
そのような作業をしません)。
注意:文字列is_a?列挙可能なので、おそらくこれはあなたが望むものではありません...オブジェクトのような配列の概念に依存します。
試してください:
def is_array(a)
a.class == Array
end
編集:他の答えは私のものよりはるかに優れています。
の使用も検討してくださいArray()
。Rubyのコミュニティスタイルガイド:
配列として扱いたい変数を処理する場合、明示的な配列チェックまたは[* var]ではなくArray()を使用しますが、それが配列であるかどうかはわかりません。
# bad
paths = [paths] unless paths.is_a? Array
paths.each { |path| do_something(path) }
# bad (always creates a new Array instance)
[*paths].each { |path| do_something(path) }
# good (and a bit more readable)
Array(paths).each { |path| do_something(path) }
to_a
新しい配列に追加された各引数に対してが呼び出されるため、ハッシュを渡すと予期しない結果が生成されArray({id: 100})
ます。そのため、戻り値[[:id, 100]]