1

これを行うためのより良い方法は何ですか?

takeこのコードは、引数が 1 つしかないため、明らかに機能しませんが、これが機能することを願っています

%w(a b c).take(5, "x") # => ["a", "b", "c", "x", "x"] 
4

10 に答える 10

3
a = %w(a b c)
(0...5).map{|i| a[i] || "x"}

nil値を含む配列で動作するバージョンは次のとおりです。

a = %w(a b c)
(0...5).map{|i| a.fetch(i,"x")}
于 2013-08-13T16:39:39.473 に答える
3

非破壊的な解決策は次のとおりです。

class Array
 def pad_and_take(n, x)
   self.dup.fill(x, self.length...n).take(n)
 end
end

# then you can do:
%w(a b c).pad_and_take(5, "x") # => ["a", "b", "c", "x", "x"]
于 2013-08-13T16:31:09.257 に答える
1

さらに別の方法:

cs = ["a", "b", "c"]
cs_padded = cs.take(5) + ["x"] * [5 - cs.size, 0].max
#=> ["a", "b", "c", "x", "x"] 
于 2013-08-13T17:03:09.667 に答える
1

澤の答えの変形:

a = %w(a b c)

(0...5).map { |i| a.fetch(i, "x") }
#=> ["a", "b", "c", "x", "x"]

偽の値に対しても機能します。

a = ["a", nil, false]

(0...5).map { |i| a.fetch(i, "x") }
#=> ["a", nil, false, "x", "x"]
于 2013-08-13T21:04:30.763 に答える
1
class Array
  def take2 n, v
    self.fill v, n
    self.take n
  end
end

a1 = [:a, :b, :c, :d]
p a1.take2 2, 123
p a1
a2 = (1..10).to_a
p a2.take2 3, :hownow
p a2
于 2013-08-13T16:28:22.473 に答える
0

パッタイ=P

class Array
  #make array from first n elements, padding with s if n>self.size
  def pad_thai n, s='x'
    sz = self.size
    n>sz ? self+[s]*(n-sz) : self.first(n)
  end
end

ar = %w(a b c)
p ar.pad_thai 2  #["a", "b"]
p ar.pad_thai 5  #["a", "b", "c", "x", "x"]
于 2013-08-13T21:03:37.037 に答える
0

いくつかのハッシュ マジックがいいようです。

# hard-coded example
array = %w[a b c]
hash  = Hash[(0...array.size).zip array]
hash.default = 'x'
hash.values_at(*0...5)
# => ["a", "b", "c", "x", "x"]

機能として、

def padded_take(array, count, pad)
  hash = Hash[(0...array.size).zip array]
  hash.default = pad
  hash.values_at(*0...count)
end
padded_take(%w[a b c], 5, 'x')
# => ["a", "b", "c", "x", "x"]
于 2013-08-13T21:26:23.607 に答える
0

これが 1 つの方法です。x を好きなものに置き換えます。

(%w(a b c) << ("x,"*5).split(",")).flatten.take(5).inspect
于 2013-08-13T16:29:08.203 に答える