วิธีที่เหมาะสมในการ:
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]]