将数组填充为特定大小

dre*_*ves 13 ruby arrays

可能有更高效,更Ruby的方法来做到这一点:

# Pad array to size n by adding x's. Don't do anything if n <= a.length.
def padleft(a, n, x)
  return a if n <= a.length
  return padleft([x] + a, n, x)
end
Run Code Online (Sandbox Code Playgroud)

你会建议什么?

saw*_*awa 24

由于我对这个问题的误解而编辑.我的答案的透明版本从右侧填补,但问题是要求从左侧进行.我相应地纠正了它.这是由于命名约定.ljust,rjust被内置于方法String,我扩展该公约到Array,但其对应于padrightpadleft分别在问题的术语.

破坏性方法

def padleft!(a, n, x)
  a.insert(0, *Array.new([0, n-a.length].max, x))
end
def padright!(a, n, x)
  a.fill(x, a.length...n)
end
Run Code Online (Sandbox Code Playgroud)

Array课堂上定义它会更自然:

class Array
  def rjust!(n, x); insert(0, *Array.new([0, n-length].max, x)) end
  def ljust!(n, x); fill(x, length...n) end
end
Run Code Online (Sandbox Code Playgroud)

非破坏性方法

def padleft(a, n, x)
  Array.new([0, n-a.length].max, x)+a
end
def padright(a, n, x)
  a.dup.fill(x, a.length...n)
end
Run Code Online (Sandbox Code Playgroud)

要么

class Array
  def rjust(n, x); Array.new([0, n-length].max, x)+self end
  def ljust(n, x); dup.fill(x, length...n) end
end
Run Code Online (Sandbox Code Playgroud)


Die*_*zar 5

FWIW:

def rpad(item, padding, num)
  Array(item).fill padding, Array(item).size, num
end
# rpad "initialize value(s)", 0, 3
# => ["initialize value(s)", 0, 0, 0]
Run Code Online (Sandbox Code Playgroud)