2016-03-29 10 views
1

Bir dizideki ilk n öğelerini almak ve saklamak için iyi bir yol nedir?Nasıl alınır? Ruby'de mi?

sonra, yerleşik bir yöntem varsa

def take! ary, n 
    ... 
end 

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

cevap

1

Dene:

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

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

fikri diziyi değiştirmektir: Array#slice! kullanma

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

başka bir olasılıktır. 'Take' will alıcı ile aynı olacaktır. –

+0

@BSeven. Tamam, cevabımı değiştirdim, daha iyi olup olmadığından emin değilim. –

+0

Evet, işe yarıyor. Cevabını bastım. 'z = (1..5) .to_a; alıcı z, 2; z' –

1

Array#replace kullanma kendisini göstermektedir:

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 

Örnek tekil yöntemi tanımlar, ancak may Dizi türetilmiş sınıfınızda #take! tanımını yapın, modül vb. iyileştirmeyi kullanın.

2

Sadece Array#slice!

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

Bunu yeniden oluşturamıyorum. X # => [3, 4] 'i alıyorum. Emin değilim neden? –

+0

Haha. Bu doğru. @ Sagarpandya82. Aynı çözümden geldim ve işe yaramadı. Çalışıyor gibi görünüyor çünkü [1,2] 'yi döndürüyor. –

+0

Oy, evet. Mea Culpa. Ben düzelteceğim. –

2

birkaç olasılık vardır kullanmayı tercih ediyorum. hep eserler sadece başka diziye herhangi diziyi dönüştürmek için kullanılabilir böylece argüman içeriğiyle alıcı içeriğini değiştirir ve Array#replace, yani Bir şey söyleyebilir ki

İsviçre Çakısı gibi:

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