วิธีเริ่มต้นอาร์เรย์ในขั้นตอนเดียวโดยใช้ Ruby


106

ฉันเริ่มต้นอาร์เรย์ด้วยวิธีนี้:

array = Array.new
array << '1' << '2' << '3'

เป็นไปได้ไหมที่จะทำในขั้นตอนเดียว? ถ้าเป็นอย่างไร


20
+1 สำหรับการกดซ้ำบรรทัดเดียวแบบใหม่ :)
Phrogz

1
@Phrogz สั้นลงเล็กน้อย: array = Array.new << 1 << 2 << 3 ;)
อเล็กซานเด Suraphel

@AlexanderSuraphel ที่สร้างอาร์เรย์ของ Fixnums แทนอาร์เรย์ของสตริง
Phrogz

1
@Phrogz ฉันแค่อยากจะพูดถึงว่ามันอาจจะสั้นกว่านี้ คุณก็ต้องเปลี่ยน1เป็น'1'.
Alexander Suraphel

คำตอบ:


192

คุณสามารถใช้ตัวอักษรอาร์เรย์:

array = [ '1', '2', '3' ]

คุณยังสามารถใช้ช่วง:

array = ('1'..'3').to_a  # parentheses are required
# or
array = *('1'..'3')      # parentheses not required, but included for clarity

สำหรับอาร์เรย์ของสตริงที่คั่นด้วยช่องว่างคุณสามารถใช้ไวยากรณ์สตริงเปอร์เซ็นต์ :

array = %w[ 1 2 3 ]

คุณยังสามารถส่งผ่านบล็อกเพื่อArray.newกำหนดค่าของแต่ละรายการได้:

array = Array.new(3) { |i| (i+1).to_s }

สุดท้ายแม้ว่าจะไม่ได้สร้างอาร์เรย์ของสามสตริงเหมือนคำตอบอื่น ๆ ข้างต้น แต่โปรดทราบว่าคุณสามารถใช้ตัวนับใน Ruby 1.8.7+ เพื่อสร้างอาร์เรย์ได้ ตัวอย่างเช่น:

array = 1.step(17,3).to_a
#=> [1, 4, 7, 10, 13, 16]

4
บวกหนึ่งสำหรับคำตอบโดยละเอียดแม้ว่าฉันจะชอบ splat มากกว่าto_a( [*'1'..'3'])
Michael Kohl

@MichaelKohl ฉันเห็นด้วย; ฉันอยู่ภายใต้การแสดงผล (ผิดพลาด) ที่คุณไม่สามารถแยกช่วงใน 1.8.6 ได้ ฉันจะเพิ่มให้ขอบคุณ! โปรดทราบว่าคุณไม่จำเป็นต้องทำการแยกภายในอาร์เรย์ลิเทอรัล (เว้นแต่ว่าคุณจะประกอบเข้ากับตัวต่อ)
Phrogz

ฉันรู้ว่าส่วนใหญ่ฉันใช้ splat เพื่อจุดประสงค์นั้น (การประกอบนั่นคือ) และฉันก็ชอบที่มันแสดงให้เห็นว่าคุณจบลงด้วยอะไร
Michael Kohl

2
นอกจากนี้ยังสามารถใช้เมธอดคลาส Array :: []: Array[ "1","2","3"] #=> ["1","2","3"](ฉันไม่คิดว่าวิธีนี้เกี่ยวข้องกับตัวสร้างลิเทอรัลอาร์เรย์) คุณยังสามารถใช้ Kernel # Array ระดับบนสุด (ชื่อเมธอดดูเหมือนชื่อคลาส)Array(1..5) #=> [1,2,3,4,5]
b1_

* ทำอะไร? ฉันจะหาเอกสารประกอบได้ที่ไหน
Arnold Roa

22

หนึ่งในสายการบิน:

array = [] << 1 << 2 << 3   #this is for fixnums.

หรือ

 a = %w| 1 2 3 4 5 |

หรือ

 a = [*'1'..'3']

หรือ

 a = Array.new(3, '1')

หรือ

 a = Array[*'1'..'3']

8
ฉันไม่ได้ลงคะแนน แต่ฉันคาดเดาเพราะสิ่งนี้เรียกใช้สามวิธีและเพิ่มอาร์เรย์ขึ้นเรื่อย ๆ ซึ่งต่างจาก[1,2,3]การเริ่มต้นเพียงครั้งเดียว นอกจากนี้คุณยังมีตัวละครมากขึ้น นอกจากนี้คุณได้สร้างอาร์เรย์ของ Fixnums ในขณะที่ OP กำลังถามเกี่ยวกับอาร์เรย์ของสตริง
Phrogz

8

นอกจากคำตอบข้างต้นแล้วคุณก็ทำได้เช่นกัน

    =>  [*'1'.."5"]   #remember *
    => ["1", "2", "3", "4", "5"]

1
ใน 1.9 >> [*?1..?5] #=> ["1", "2", "3", "4", "5"]คุณยังสามารถทำมันได้ด้วยวิธีนี้:
Michael Kohl

7

เพื่อพิสูจน์ว่ามีวิธีทำมากกว่าหนึ่งหกวิธี:

plus_1 = 1.method(:+)
Array.new(3, &plus_1) # => [1, 2, 3]

หากไม่สามารถ 1.method (: +) ได้คุณสามารถทำได้เช่นกัน

plus_1 = Proc.new {|n| n + 1}
Array.new(3, &plus_1) # => [1, 2, 3]

แน่นอนว่ามันเกินความจำเป็นในสถานการณ์นี้ แต่ถ้าplus_1เป็นนิพจน์ที่ยาวมากคุณอาจต้องการวางไว้ในบรรทัดแยกต่างหากจากการสร้างอาร์เรย์


3

คุณทำได้

array = ['1', '2', '3']

ดังที่คนอื่น ๆ ได้กล่าวไว้คุณสามารถเริ่มต้นอาร์เรย์ด้วยสัญกรณ์% w ดังนี้:

array = %w(1 2 3)

หรือ

array = %w[1 2 3]

โปรดทราบว่าในทั้งสองกรณีแต่ละองค์ประกอบจะเป็นสตริงแทนที่จะเป็นจำนวนเต็ม ดังนั้นหากคุณต้องการอาร์เรย์ที่มีองค์ประกอบเป็นจำนวนเต็มคุณไม่ควรรวมแต่ละองค์ประกอบด้วยเครื่องหมายอะพอสทรอฟี:

array_of_integers = [1, 2, 3]

นอกจากนี้คุณไม่จำเป็นต้องใส่เครื่องหมายจุลภาคระหว่างองค์ประกอบ (ซึ่งจำเป็นเมื่อสร้างอาร์เรย์โดยไม่มีสัญกรณ์% w นี้) หากคุณทำสิ่งนี้ (ซึ่งฉันมักทำโดยไม่ได้ตั้งใจ) ดังใน:

wrong_array = %w(1, 2, 3)

องค์ประกอบจะเป็นสามสาย ---- "1,", "2,", "3" ดังนั้นถ้าคุณทำ:

puts wrong_array

ผลลัพธ์จะเป็น:

1,
2,
3
=>nil

ซึ่งไม่ใช่สิ่งที่เราต้องการที่นี่

หวังว่านี่จะช่วยชี้แจงประเด็น!



2

หากคุณมีอาร์เรย์ของสตริงคุณสามารถเริ่มต้นได้เช่นนี้:

array = %w{1 2 3}

เพียงแค่แยกแต่ละองค์ประกอบด้วยช่องว่างใด ๆ


1

คุณสามารถเริ่มต้นอาร์เรย์ได้ในขั้นตอนเดียวโดยเขียนองค์ประกอบ[]ดังนี้:

array = ['1', '2', '3']

0

คุณสามารถทำได้โดยใช้%wสัญกรณ์ในอาร์เรย์ทับทิม

array = %w(1 2 3)

มันจะเพิ่มค่าอาร์เรย์ 1,2,3 ให้กับอาร์เรย์และพิมพ์ผลลัพธ์เป็น ["1", "2", "3"]

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.