2014-10-07 32 views
1

我正在研究需要使用lambdas和特效的kata。在Ruby文檔的。參數,參數在對象上調用返回這個例子中,直接從文檔:需要Proc.parameter方法的說明?符號是什麼意思:休息是什麼意思?

prc = lambda{|x,y=42, *other|} 
prc.parameters => [[:req, :x], [:opt, :y], [:rest, :other]] 

:req = required 
:opt = optional 
:rest = ??? 

這可能是一個愚蠢的問題,但什麼:其餘的代表沒有立即浮現在腦海。這是什麼意思?謝謝。

回答

2

這可能是一個愚蠢的問題,但並沒有馬上想到什麼:rest看臺。這是什麼意思?

這是一個休息參數,即它獲取綁定到的未結合於需要的或可選的參數的參數的所有其餘部分的陣列的參數。

這裏是所有(目前)可能的是,參數類型標記值:

->(req, opt=:o, *rest, kreq:, k: :k, **krest, &b) {}.parameters 
# => [[:req, :req],  # required parameter 
#  [:opt, :opt],  # optional parameter with default argument 
#  [:rest, :rest],  # rest parameter (bound to an Array) 
#  [:keyreq, :kreq], # required keyword parameter 
#  [:key, :k],   # optional keyword parameter with default argument 
#  [:keyrest, :krest], # keyword rest parameter (bound to a Hash) 
#  [:block, :b]]  # block parameter (bound to a Proc or nil) 

該實施例顯示Ruby的論點結合語義的所有可能性:

def foo(m1, m2, o1=:o1, o2=:o2, *splat, m3, m4, 
      ok1: :ok1, mk1:, mk2:, ok2: :ok2, **ksplat, &blk) 
    local_variables.map {|var| [var, eval(var.to_s)] }.to_h 
end 

method(:foo).arity 
# => -5 

method(:foo).parameters 
# => [[:req, :m1], [:req, :m2], [:opt, :o1], [:opt, :o2], [:rest, :splat], 
#  [:req, :m3], [:req, :m4], [:keyreq, :mk1], [:keyreq, :mk2], 
#  [:key, :ok1], [:key, :ok2], [:keyrest, :ksplat], [:block, :blk]] 

foo(1, 2, 3, 4) 
# ArgumentError: missing keywords: mk1, mk2 

foo(1, 2, 3, mk1: 4, mk2: 5) 
# ArgumentError: wrong number of arguments (3 for 4+) 

foo(1, 2, 3, 4, mk1: 5, mk2: 6) 
# => { m1: 1, m2: 2, o1: :o1, o2: :o2, splat: [], m3: 3, m4: 4, 
#  ok1: :ok1, mk1: 5, mk2: 6, ok2: :ok2, ksplat: {}, 
#  blk: nil } 

foo(1, 2, 3, 4, 5, mk1: 6, mk2: 7) 
# => { m1: 1, m2: 2, o1: 3, o2: :o2, splat: [], m3: 4, m4: 5, 
#  ok1: :ok1, mk1: 6, mk2: 7, ok2: :ok2, ksplat: {}, 
#  blk: nil } 

foo(1, 2, 3, 4, 5, 6, mk1: 7, mk2: 8) 
# => { m1: 1, m2: 2, o1: 3, o2: 4, splat: [], m3: 5, m4: 6, 
#  ok1: :ok1, mk1: 7, mk2: 8, ok2: :ok2, ksplat: {}, 
#  blk: nil } 

foo(1, 2, 3, 4, 5, 6, 7, mk1: 8, mk2: 9) 
# => { m1: 1, m2: 2, o1: 3, o2: 4, splat: [5], m3: 6, m4: 7, 
#  ok1: :ok1, mk1: 8, mk2: 9, ok2: :ok2, ksplat: {}, 
#  blk: nil } 

foo(1, 2, 3, 4, 5, 6, 7, 8, mk1: 9, mk2: 10) 
# => { m1: 1, m2: 2, o1: 3, o2: 4, splat: [5, 6], m3: 7, m4: 8, 
#  ok1: :ok1, mk1: 9, mk2: 10, ok2: :ok2, ksplat: {}, 
#  blk: nil } 

foo(1, 2, 3, 4, 5, 6, 7, 8, ok1: 9, mk1: 10, mk2: 11) 
# => { m1: 1, m2: 2, o1: 3, o2: 4, splat: [5, 6], m3: 7, m4: 8, 
#  ok1: 9, mk1: 10, mk2: 11, ok2: :ok2, ksplat: {}, 
#  blk: nil } 

foo(1, 2, 3, 4, 5, 6, 7, 8, ok1: 9, mk1: 10, mk2: 11, ok2: 12) 
# => { m1: 1, m2: 2, o1: 3, o2: 4, splat: [5, 6], m3: 7, m4: 8, 
#  ok1: 9, mk1: 10, mk2: 11, ok2: 12, ksplat: {}, 
#  blk: nil } 

foo(1, 2, 3, 4, 5, 6, 7, 8, ok1: 9, mk1: 10, mk2: 11, ok2: 12, k3: 13) 
# => { m1: 1, m2: 2, o1: 3, o2: 4, splat: [5, 6], m3: 7, m4: 8, 
#  ok1: 9, mk1: 10, mk2: 11, ok2: 12, ksplat: {k3: 13}, 
#  blk: nil } 

foo(1, 2, 3, 4, 5, 6, 7, 8, ok1: 9, mk1: 10, mk2: 11, ok2: 12, k3: 13, k4: 14) 
# => { m1: 1, m2: 2, o1: 3, o2: 4, splat: [5, 6], m3: 7, m4: 8, 
#  ok1: 9, mk1: 10, mk2: 11, ok2: 12, ksplat: {k3: 13, k4: 14}, 
#  blk: nil } 

foo(1, 2, 3, 4, 5, 6, 7, 8, 
     ok1: 9, ok2: 10, mk1: 11, mk2: 12, k3: 13, k4: 14) do 15 end 
# => { m1: 1, m2: 2, o1: 3, o2: 4, splat: [5, 6], m3: 7, m4: 8, 
#  ok1: 9, mk1: 10, mk2: 11, ok2: 12, ksplat: {k3: 13, k4: 14}, 
#  blk: #<Proc:[email protected](irb):15> } 
0

Rest = * other。 *會吸收數組中其餘的參數。就拿這個例子:

def a_method(a, b, *rest) 
    p a #=> 1 
    p b #=> 2 
    p rest #=> [3, 4, 5, 6, 7] 
end 

a_method(1,2,3,4,5,6,7)