2016-03-29 24 views
1

Was ist eine gute Möglichkeit, die ersten n Elemente in einem Array zu behalten (zu behalten) und den Rest zu löschen?Wie zu tun! in Rubin?

Wenn es keine integrierte Methode ist, dann

def take! ary, n 
    ... 
end 

z = (1..10).to_a 
take! z, 5 
# z is [1,2,3,4,5] 

Antwort

1

Versuchen:

def taker(arr, n) 
    arr.pop(arr.length - n) 
    arr 
end 

p taker([1, 2, 3, 4, 5], 2) #=> [1, 2] 
+0

die Idee ist, das Array zu ändern. 'Nehmen' ist das selbe wie Nehmer. –

+0

@BSeven. Okay, änderte meine Antwort, nicht sicher, ob es besser ist. –

+0

Ja, das funktioniert. Ich habe deine Antwort erneuert. 'z = (1..5) .zu_a; Z, 2; z' –

1

Array#replace Verwendung nahe:

z = (1..10).to_a 
z.object_id # 23576880 

def z.take! n 
    replace(take n) 
end 

z.take! 5  # [1, 2, 3, 4, 5] 
z.object_id # 23576880 

Beispiel Singleton-Methode definiert, aber man kann Definieren Sie #take! für Ihre Array-abgeleitete Klasse, indem Sie die Verfeinerung für ein Modul usw. verwenden.

2

würde ich nur Array#slice!

x = [1, 2, 3, 4] 
x.slice!(2..-1) # Will take! the first 2 elements of the array 
x # => [1, 2] 
+0

Ich kann das nicht reproduzieren. Ich bekomme 'x # => [3, 4]'. Nicht sicher warum? –

+0

Haha. Das ist richtig. @ sagarpandya82. Ich habe die gleiche Lösung gefunden und es hat nicht funktioniert. Es scheint zu funktionieren, weil es '[1,2]' zurückgibt. –

+0

Oy, ja. Mea culpa. Ich werde es korrigieren. –

2

Es gibt mehrere Möglichkeiten.

Das Schweizer Taschenmesser, dass immer Werke ist Array#replace, die einfach den Inhalt des Empfängers mit dem Inhalt des Arguments ersetzt, und somit verwendet werden, kann eine beliebige Anordnung in eine andere Anordnung zu verändern, so kann man einfach etwas sagen wie:

class Array 
    def take!(n) 
    replace(take(n)) 
    end 
end 

Array#slice! Verwendung ist eine weitere Möglichkeit:

class Array 
    def take!(n) 
    slice!(0, n) 
    end 
end