Apa cara yang tepat untuk:
is_array("something") # => false (or 1)
is_array(["something", "else"]) # => true (or > 1)
atau untuk mendapatkan jumlah item di dalamnya?
Apa cara yang tepat untuk:
is_array("something") # => false (or 1)
is_array(["something", "else"]) # => true (or > 1)
atau untuk mendapatkan jumlah item di dalamnya?
Jawaban:
Anda mungkin ingin menggunakannya kind_of()
.
>> s = "something"
=> "something"
>> s.kind_of?(Array)
=> false
>> s = ["something", "else"]
=> ["something", "else"]
>> s.kind_of?(Array)
=> true
kind_of?()
solusi lain? Beberapa penjelasan tentang manfaat jawaban Anda terhadap orang lain akan membantu pembaca di masa mendatang.
Apakah Anda yakin itu perlu array? Anda mungkin dapat menggunakan respond_to?(method)
sehingga kode Anda akan bekerja untuk hal-hal serupa yang belum tentu array (mungkin beberapa hal yang dapat diatasi). Jika Anda benar-benar membutuhkan array
, maka postingan yang menjelaskan Array#kind\_of?
metode yang terbaik.
['hello'].respond_to?('each')
respond_to?(:to_ary)
.
Alih-alih menguji Array,
hanya mengkonversi apa pun yang Anda dapatkan menjadi satu tingkat Array,
sehingga kode Anda hanya perlu menangani satu kasus.
t = [*something] # or...
t = Array(something) # or...
def f *x
...
end
Ruby memiliki berbagai cara untuk menyelaraskan API yang dapat mengambil objek atau Array objek, jadi, tebak mengapa Anda ingin tahu apakah ada sesuatu yang terjadi. Array, saya punya saran.
The percikan Operator berisi banyak sihir Anda dapat melihat, atau Anda hanya dapat memanggil Array(something)
yang akan menambahkan wrapper Array jika diperlukan. Mirip dengan [*something]
kasus yang satu ini.
def f x
p Array(x).inspect
p [*x].inspect
end
f 1 # => "[1]"
f [1] # => "[1]"
f [1,2] # => "[1, 2]"
Atau, Anda bisa menggunakan percikan dalam deklarasi parameter dan kemudian .flatten
, memberi Anda jenis kolektor yang berbeda. (Dalam hal ini, Anda bisa menelepon ke .flatten
atas juga.)
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]"
Dan, terima kasih gregschlom , kadang-kadang lebih cepat hanya digunakan Array(x)
karena ketika sudah menjadi Array
tidak perlu membuat objek baru.
[*nil] => []
. Jadi, Anda mungkin berakhir dengan array kosong.
Array(foo)
jauh lebih efisien daripada[*foo]
[1,2,3].is_a? Array
mengevaluasi ke true.
is_a?
pada keseluruhan utas ini. Yang terdekat adalah a [1,2,3].is_a? Enumerable
. Saya masih berpikir ada baiknya sementara memiliki jawaban ini.
Sepertinya Anda mencari sesuatu yang memiliki beberapa konsep barang. Dengan demikian saya akan merekomendasikan melihat apakah itu Enumerable
. Itu juga menjamin keberadaan #count
.
Sebagai contoh,
[1,2,3].is_a? Enumerable
[1,2,3].count
perhatikan bahwa, sementara size
, length
dan count
semua berfungsi untuk array, count
adalah makna yang tepat di sini - (misalnya, 'abc'.length
dan 'abc'.size
keduanya berfungsi, tetapi 'abc'.count
tidak berfungsi seperti itu).
Perhatian: string is_a? Dapat dihitung, jadi mungkin ini bukan yang Anda inginkan ... tergantung pada konsep Anda tentang objek seperti array.
Mencoba:
def is_array(a)
a.class == Array
end
EDIT : Jawaban lainnya jauh lebih baik dari pada saya.
Juga pertimbangkan untuk menggunakan Array()
. Dari Panduan Gaya Komunitas Ruby :
Gunakan Array () alih-alih centang Array eksplisit atau [* var], saat berurusan dengan variabel yang ingin Anda perlakukan sebagai Array, tetapi Anda tidak yakin itu adalah 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
dipanggil pada setiap argumen yang ditambahkan ke array baru, jadi Array({id: 100})
kembali[[:id, 100]]