Ruby kullanarak tek adımda bir dizi nasıl başlatılır?


105

Bir diziyi şu şekilde başlatıyorum:

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

Bunu tek adımda yapmak mümkün mü? Öyleyse nasıl?


20
+1 sadece yeni tek satırda tekrarlanan itme için. :)
Phrogz

1
@Phrogz biraz daha kısa array = Array.new << 1 << 2 << 3 :;)
Alexander Suraphel

@AlexanderSuraphel Bu, bir dizi dizisi yerine bir Fixnum dizisi oluşturur.
Phrogz

1
@Phrogz daha da kısalabileceğini belirtmek istedim. Sadece değişime sahip 1üzere '1'.
Alexander Suraphel

Yanıtlar:


192

Bir dizi değişmezi kullanabilirsiniz:

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

Ayrıca bir aralık da kullanabilirsiniz:

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

Boşluklarla sınırlanmış dizelerden oluşan diziler için Yüzde Dize sözdizimini kullanabilirsiniz :

array = %w[ 1 2 3 ]

Array.newHer bir girişin değerinin ne olacağını belirlemek için bir blok da geçebilirsiniz :

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

Son olarak, yukarıdaki diğer yanıtlarla aynı dizge dizisini üretmese de, diziler oluşturmak için Ruby 1.8.7+ içinde numaralandırıcıları kullanabileceğinizi unutmayın; Örneğin:

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

4
Artı, ayrıntılı cevap için bir tane, to_a( [*'1'..'3']) yerine sıçramayı tercih etsem bile .
Michael Kohl

@MichaelKohl Katılıyorum; 1.8.6'da aralıkları ayıramayacağınıza dair (yanlış) bir izlenim içindeydim. Bunu ekleyeceğim, teşekkürler! Bir dizi değişmezi içinde uyarlamanıza gerek olmadığını unutmayın (uyarıyla birlikte birleştirme yapmadığınız sürece).
Phrogz

Biliyorum, sadece bu amaç için çoğunlukla splat kullanıyorum (yani birleştirme) ve ayrıca neyle sonuçlandığınızı göstermesini de seviyorum.
Michael Kohl

2
Ayrıca, Array :: [] sınıf yöntemi kullanılabilir: Array[ "1","2","3"] #=> ["1","2","3"](Bu yöntemin dizi değişmez yapıcısı ile ilgisi olduğunu düşünmüyorum). Üst düzey Kernel # Array(1..5) #=> [1,2,3,4,5]
Array'ı

* ne yapar? bunun için belgeleri nerede bulabilirim?
Arnold Roa

22

Oneliner:

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

veya

 a = %w| 1 2 3 4 5 |

veya

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

veya

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

veya

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

8
Buna oy vermedim, ancak tahmin ediyorum çünkü bu üç yöntemi çağırdı ve [1,2,3]tek bir başlatmanın aksine diziyi aşamalı olarak büyüttü. Ayrıca seninki daha çok karakter. Ayrıca, OP bir dizi dizi hakkında soru sorarken, bir Fixnum dizisi oluşturdunuz.
Phrogz

8

Yukarıdaki cevapların yanı sıra bunu da yapabilirsiniz

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

1
1.9 aylarında da bu şekilde yapabilirsiniz: >> [*?1..?5] #=> ["1", "2", "3", "4", "5"].
Michael Kohl

7

More Than var kanıtlamak için bir Altı Yolları için Do It:

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

1. yöntem (: +) mümkün değilse, bunu da yapabilirdiniz

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

Elbette, bu senaryoda aşırıdır, ancak plus_1gerçekten uzun bir ifadeyse, onu dizi oluşturmadan ayrı bir satıra koymak isteyebilirsiniz.


3

Yapabilirsin

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

Diğerlerinin de belirttiği gibi, bir diziyi% w gösterimi ile şu şekilde başlatabilirsiniz:

array = %w(1 2 3)

veya

array = %w[1 2 3]

Lütfen her iki durumda da her elemanın bir tamsayı değil, bir dizge olduğunu unutmayın. Dolayısıyla, öğeleri tam sayı olan bir dizi istiyorsanız, her öğeyi kesme işaretleriyle sarmamalısınız:

array_of_integers = [1, 2, 3]

Ayrıca, öğeler arasına virgül koymanıza gerek yoktur (bu,% w gösterimi olmadan bir dizi oluştururken gereklidir). Bunu yaparsanız (genellikle yanlışlıkla yaptım), aşağıdaki gibi:

wrong_array = %w(1, 2, 3)

elemanları üç dize olacaktır ---- "1,", "2,", "3". Yani yaparsan:

puts wrong_array

çıktı:

1,
2,
3
=>nil

Burada istediğimiz şey bu değil.

Umarım bu, noktayı netleştirmeye yardımcı olur!


2

Böyle bir dizi oluşturmak için şunları yapabilirsiniz:

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

2

Bir dizi diziniz varsa, bunu şu şekilde de başlatabilirsiniz:

array = %w{1 2 3}

sadece her bir öğeyi herhangi bir boşlukla ayırın


1

Öğeleri şu şekilde yazarak bir diziyi tek adımda başlatabilirsiniz []:

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

0

Bunu %wruby dizilerinde gösterimlerle kolayca yapabilirsiniz .

array = %w(1 2 3)

1,2,3 dizi değerlerini diziye ekleyecek ve çıktıyı şu şekilde yazdıracaktır: ["1", "2", "3"]

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.