2017-03-02 3 views
4

Verwenden von Ruby 2.4. Ich habe eine Reihe von Saiten. Wie ersetze ich ein Element in einem Array durch möglicherweise mehrere Elemente? Ich habeIn Ruby, wie ersetze ich ein Element in einem Array mit möglicherweise mehreren Elementen?

phrases[index] = tokens 

jedoch Token ein Array ist und jetzt ergibt sich eine Phrasen-Array mit Strings und einem Array ...

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

Wenn Token ist [ "a", "b"] und Index ist 1, ich möchte das Ergebnis zu sein

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

Wie mache ich das?

Antwort

4

Sie können start und length mit Array#[]= angeben; ersetzt ein Sub-Array von Index für length Elemente

oder angeben range; ersetzt ein Sub-Array, das durch den Indexbereich angegeben wird.

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

Nizza, habe ich nie cam über diese Syntax. Gut zu wissen! –

+1

Es ist 'ary [Anfang, Länge] = obj oder other_ary oder nil' im [' [] = '] (http://ruby-doc.org/core-2.4.0/Array.html#method-i- 5B-5D-3D) Dokumentation. –

0

können Sie Enumerable#flat_map verwenden:

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

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

arr unverändert ist. So ändert arr vorhanden,

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

Wohnung Karte wäre ein besserer Weg, um darüber zu gehen, es Karten (Transformationen) dann die Liste flacht zu einem einzigen Array. Sagen wir zwei Elemente für die geraden Zahlen hinzufügen wollte:

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

Es wäre zurück:

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

Im Vergleich zu kartieren, die zurückkehren würde:

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