2016-03-29 3 views
1

配列の最初のn個の要素を取り出し(残りの部分を削除する)良い方法はありますか?取る方法! Rubyで?

組み込みメソッドが存在しない場合は、

def take! ary, n 
    ... 
end 

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

答えて

1

試してみてください。

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

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

アイデアは、配列を変更することです。 「テイク」は受取人と同じです。 –

+0

@BSeven。私の答えを変えました。 –

+0

はい、それは動作します。私はあなたの答えをupvoted。 'z =(1..5).to_a; taker z、2; z' –

1

Array#replaceを使用しては、自分自身を示唆:

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 

例はシングルトンメソッドを定義していますが、かもしれません配列の派生クラスに#take!を定義し、モジュールなどのリファインメントを使用します。

2

私はいくつかの可能性がありますArray#slice!

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

これは再現できません。 'x#=> [3、4]'となっています。理由は分かりませんか? –

+0

ハハ。そのとおりです。 @ sagarpandya82。私はこの同じ解決策を思いついたが、うまくいかなかった。それは '[1,2]'を返すので動作するようです。 –

+0

オイ、そうです。 Mea culpa。私はそれを修正します。 –

2

を使用すると思います。 常に作品は単に引数の内容と受信機の内容を置き換えるので、あなただけの何かを言うことができますので、任意の他の配列に任意の配列を変換するために使用することができますArray#replaceであることを

スイスアーミーナイフ以下のような:Array#slice!を使用して

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

は別の可能性である:

class Array 
    def take!(n) 
    slice!(0, n) 
    end 
end 
関連する問題