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.