2017-03-02 13 views
4

Ruby 2.4を使用しています。私は弦の配列を持っています。配列内の1つの要素を複数の要素に置き換えるにはどうすればよいですか?私は Rubyでは、配列内の要素を潜在的に複数の要素に置き換えるにはどうすればよいですか?

["abc", ["a", "b"], "123"] 

トークンがある場合

[「A」、「B」] ...

phrases[index] = tokens 

しかしトークンが配列され、今、これは文字列と配列を持つフレーズ配列になり持っていますインデックスが1の場合、結果は

です。
["abc", "a", "b", "123"] 

どうすればよいですか?

答えて

4

startlengthArray#[]=と指定できます。 要素のstartのサブ配列を置き換えます。

またはrangeを指定します。インデックスの範囲で指定されたサブ配列を置き換えます。

phrases = ["abc", "token_placeholder", "123"] 
tokens = ["a", "b"] 
index = 1 
phrases[index, 1] = tokens 
#  ^^^^^^^^^ ------------------ start and length 

# OR phrases[index..index] = tokens 
#   ^^^^^^^^^^^^ -------------- range 

phrases # => ["abc", "a", "b", "123"] 
+2

ニースこの間、私は決してカム構文。知っておいてよかった! –

+1

['[] ='](http://ruby-doc.org/core-2.4.0/Array.html#method-i-)の 'ary [start、length] = objまたはother_aryまたはnil'です5B-5D-3D)のドキュメントを参照してください。 –

0

あなたはEnumerable#flat_mapを使用することができます。

arr = ["abc", ["a", "b"], "123"] 

arr.flat_map(&:itself) 
    #=> ["abc", "a", "b", "123"] 

arrは変更されません。代わりにarrを変更するには、

arr.replace(arr.flat_map(&:itself)) 
    #=> ["abc", "a", "b", "123"] 
arr 
    #=> ["abc", "a", "b", "123"] 
0

フラットマップはそれについて移動する良い方法だろう、それは(トランスフォーム)をマッピングし、その後、単一の配列にリストを平坦化します。私たちも、番号の2つの要素を追加したいと言う:

(1..10).flat_map { |i| i.even? ? [i, i**2] : i } 

それが戻ってくる。戻ってくるマップと比較して

[1, 2, 4, 3, 4, 16, 5, 6, 36, 7, 8, 64, 9, 10, 100] 

を:

[1, [2, 4], 3, [4, 16], 5, [6, 36], 7, [8, 64], 9, [10, 100]] 
関連する問題