วิธีที่เหมาะสมในการ:
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)ดังนั้นโค้ดของคุณจะทำงานกับสิ่งที่คล้ายกันซึ่งไม่จำเป็นต้องใช้อาร์เรย์ หากคุณต้องการจริงๆarrayแล้วโพสต์ที่อธิบายArray#kind\_of?วิธีการที่ดีที่สุด
['hello'].respond_to?('each')
respond_to?(:to_ary)ถ้าคุณต้องการบางสิ่งบางอย่างมากขึ้นอาร์เรย์เช่นคุณอาจต้องการ
แทนที่จะทดสอบArray,เพียงแค่แปลงสิ่งที่คุณได้รับในระดับเดียวArray,ดังนั้นโค้ดของคุณจำเป็นต้องจัดการกับเคสเดียว
t = [*something] # or...
t = Array(something) # or...
def f *x
...
end
Ruby มีหลายวิธีในการประสาน API ซึ่งสามารถนำวัตถุหรือ Array ของวัตถุได้ดังนั้นลองเดาว่าทำไมคุณถึงอยากรู้ว่ามีอะไรบ้างที่เป็น Array ฉันมีคำแนะนำ
เครื่องหมายประกอบการมีจำนวนมากของเวทมนตร์ที่คุณสามารถมองขึ้นหรือคุณก็สามารถโทรArray(something)ซึ่งจะเพิ่มเสื้อคลุมอาร์เรย์ถ้าจำเป็น มันคล้ายกับ[*something]ในกรณีนี้
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 ประเมินเป็นจริง
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 :
ใช้ Array () แทนที่จะเป็น Array check หรือ [* var] เมื่อจัดการกับตัวแปรที่คุณต้องการใช้เป็น Array แต่คุณไม่แน่ใจว่าเป็น 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]]