0

(より複雑なメソッドの一部として) 配列からサイズ 3 のスライスを動的に取得する必要があります。

a = %w(a b c d e)
i = 0 # i is an argument, I need [nil, "a", "b"]
a[(i-1)..(i+1)]
=> [] # no luck
a[(i-1), 3]
=> ["e"]

コードがおかしくなったとき、それは ruby​​ のせいではなく、私のせいだということを私は知っています。私は何が欠けていますか?これを達成するためのより良い方法はありますか?

明確にする必要があります。私が欲しいのは、特定のインデックスの周りnilに特定のサイズのスライスがあり、スライスがオフセットを超えた場合にマッピングすることです。

4

4 に答える 4

2

これを行うためのコンパクトな方法を次に示します。これは、配列を超えるインデックス付けが を返すという事実に依存していますnil

>> i = 0; 3.times.map{|j| a[j+i]}
=> ["a", "b", "c"]
>> i = 4; 3.times.map{|j| a[j+i]}
=> ["e", nil, nil]
于 2013-02-27T19:12:37.553 に答える
0

each_sliceお探しの方法はありますか?それ以外の場合は、実際に達成したいことのより良い例を提供してみてください.

于 2013-02-27T19:12:51.093 に答える
0

Enumerable#each_consトリックを行います:

a.each_cons(3){|slice| p slice }

出力:

["a", "b", "c"]
["b", "c", "d"]
["c", "d", "e"]
于 2013-02-27T20:03:33.143 に答える
0

これが私が作った方法です(負の値を索引付けするRubyを回る必要があります):

a = %w(a b c d e)
def slice_around(ary, index)
  slice_3 = ->(x){ x == 0 ? [ary.size+1,0,1] : ((x-1)..(x+1)).to_a }
  idxs = slice_3.call(index).map { |i| ary[i] }
end

> slice_around a, 0
=> [nil, "a", "b"]
> slice_around a, 2
=> ["b", "c", "d"]

ただし、負のインデックスが渡された場合は機能しません。

于 2013-02-27T23:58:21.930 に答える