Doğru yol nedir:
is_array("something") # => false (or 1)
is_array(["something", "else"]) # => true (or > 1)
veya içindeki öğelerin sayısını almak için?
Doğru yol nedir:
is_array("something") # => false (or 1)
is_array(["something", "else"]) # => true (or > 1)
veya içindeki öğelerin sayısını almak için?
Yanıtlar:
Muhtemelen kullanmak istiyorsunuz kind_of()
.
>> s = "something"
=> "something"
>> s.kind_of?(Array)
=> false
>> s = ["something", "else"]
=> ["something", "else"]
>> s.kind_of?(Array)
=> true
kind_of?()
diğer çözümlerden daha fazla kullanmak istersiniz ? Cevabınızın diğerlerine göre faydaları hakkında bazı açıklamalar gelecekteki okuyucular için yararlı olacaktır.
Dizi olması gerektiğinden emin misiniz ? Kullanılacak mümkün olabilir respond_to?(method)
kodunuzu mutlaka diziler (belki başka enumberable şey) değildir benzer şeyler için çalışacak böylece. Aslında bir ihtiyacınız varsa array
, Array#kind\_of?
yöntemi açıklayan yazı en iyisidir.
['hello'].respond_to?('each')
respond_to?(:to_ary)
.
Array,
Tek bir seviyeye dönüştürmek için sadece bir dönüşümü test etmek yerine, Array,
kodunuzun yalnızca bir durumu ele alması gerekir.
t = [*something] # or...
t = Array(something) # or...
def f *x
...
end
Yakut bir şey olmadığını bilmek istiyorum neden bir tahmin alarak bir nesne ya da nesnelerin bir Array alabilir bir API uyumlu hale getirmek için çeşitli yollar vardır, bu yüzden olduğu bir Dizi, bir önerim var.
Uyarısı operatörü sihirli bir sürü içerir yukarı bakmak, ya da sadece çağırabilir Array(something)
gerekirse Dizi sarıcı ekleyecek olan. [*something]
Bu bir davaya benziyor .
def f x
p Array(x).inspect
p [*x].inspect
end
f 1 # => "[1]"
f [1] # => "[1]"
f [1,2] # => "[1, 2]"
Veya, parametre bildiriminde uyarıyı kullanabilir ve sonra .flatten
size farklı bir koleksiyoncu verebilirsiniz . (Bu konuda .flatten
yukarıda da arayabilirsiniz .)
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]"
Ve teşekkürler gregschlom , bazen sadece kullanmak daha hızlıdır Array(x)
çünkü zaten bir olduğunda Array
yeni bir nesne yaratmaya gerek yoktur.
[*nil] => []
. Böylece boş bir dizi elde edebilirsiniz.
Array(foo)
çok daha verimli[*foo]
[1,2,3].is_a? Array
doğru olarak değerlendirir.
is_a?
olan kısa bir cevap yok . En yakın olanı [1,2,3].is_a? Enumerable
. Bu cevaba sahip olmanın hala değerli olduğunu düşünüyorum.
Bazı öğeler konseptine sahip bir şeyin peşindesiniz. Böylece olup olmadığını görmenizi tavsiye ederim Enumerable
. Bu aynı zamanda varlığını da garanti eder #count
.
Örneğin,
[1,2,3].is_a? Enumerable
[1,2,3].count
ederken, unutmayın size
, length
ve count
diziler için bütün iş, count
(örneğin, - Burada doğru anlamı 'abc'.length
ve 'abc'.size
hem iş, ama 'abc'.count
böyle iş yapmaz).
Dikkat: bir dize is_a? Numaralandırılabilir, bu yüzden belki de bu istediğiniz şey değildir ... dizi benzeri bir nesne kavramınıza bağlıdır.
Deneyin:
def is_array(a)
a.class == Array
end
EDIT : Diğer cevap benimkinden çok daha iyi.
Ayrıca kullanmayı düşünün Array()
. Gönderen Yakut Topluluk Stil Rehberi :
Dizi olarak değerlendirmek istediğiniz bir değişkenle uğraşırken açık Dizi kontrolü veya [* var] yerine Array () kullanın, ancak bunun bir dizi olduğundan emin değilsiniz.
# 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
, yeni diziye eklenen her bağımsız değişken için çağrıldığı için bir Hash'i geçerken beklenmedik sonuçlar üretecektir , bu nedenle Array({id: 100})
döner[[:id, 100]]