0

我在做 http://www.rubeque.com/problems/queue-continuum/solutions/51a26923ba804b00020000df我在那里呆了一段时间。我不明白为什么这段代码没有通过

def initialize(queue)
  @q = queue
end

def pop(n=1)
  @q.shift(n)

end

def push(arr)
  arr.each { |x|
    @q.push(x)
  }
  return true
end

def to_a
  @q
end

但这完美无缺。

def initialize(queue)
  @q = queue
end

def pop(*n)
  @q.shift(*n)

end

def push(arr)
  @q.push(*arr)
  return true
end

def to_a
  @q
end

我很困惑

def pop(*n)
  @q.shift(*n)

end

def push(arr)
  @q.push(*arr)
end

为什么我应该将 (arr) 作为数组而不是将其更改为... *arr 这是数组的数组?我很困惑,请帮助!

4

1 回答 1

1

splat 有两种工作方式。

接收参数时,它将参数组合成一个数组。

def foo *args; args end
foo(1) # => [1]
foo(1, 2, 3) # => [1, 2, 3]

给出参数时,它将数组分解为参数。

def bar x, y, z; y end
bar(*[1, 2, 3]) # => 2

def baz x; x end
baz(1) # => [1]
baz(1, 2, 3) # => Error

*arr你想知道的是后一种情况。它不是像这样的对象[1, 2, 3](因此,不是数组数组)。它是1, 2, 3传递给方法的参数(如 )的一部分。

splats 还有其他用途(如数组文字、case 语句等),但它们的功能是上述两种用途中的一种。

于 2013-05-26T20:21:42.167 回答