我试图更深入地理解Ruby并且正在阅读:
http://www.zenspider.com/Languages/Ruby/QuickRef.html#25
但是,我不明白以下定义中的含义:
parameters := ( [param]* [, hashlist] [*array] [&aProc] )
我知道“param”是指定的任意数量的参数,然后我会迷失其余的含义吗?
例如,我有:
def doIt(param1, param2, param3)
end
并且在这种情况下[param] *等于param1,param2,param3 ......那么hashlist会在哪里进来?和*数组和& aProc?
有人可以请我澄清一下
答案 0 :(得分:2)
如果方法的最后一个参数是非空哈希文字,则可以像这样传递
def foo(x, y, the_hash)
p the_hash['key2']
end
foo(0, 0, :key1 => 'val1', 'key2' => 42) # 42
而不是正常的方式:
foo(0, 0, { :key1 => 'val1', 'key2' => 42 }) # 42
通常,哈希默认为{}
(def foo(x, y, the_hash = {})
),因此传递空哈希符合此方案。
此外,您可以指定一个“catch-all”(splat)参数,该参数将成为尚未分配给普通参数的所有参数的数组:
def foo(p1, *rest)
p rest
end
foo(0) # "[]"
foo(0, 23, 42) # "[23, 42]"
或者,例如
def foo(p1, *rest, p2)
p rest
end
foo(0, 100) # "[]"
foo(0, 100, 23, 42) # "[100, 23]"
在具有默认值的参数之前,您不能使用splat参数。因此,散列参数语法和splat参数很少组合使用。
最后,在您的方法定义中,您可以将最后一个参数作为前缀为&
的标识符,该标识符将指向方法调用的块(其Proc
对象)或nil
如果没有。如果您只想调用块,通常不需要这样做 - 您可以使用yield
。
def foo(&p)
p.call
end
foo { puts "hello" } # hello
VS
def foo
yield
end
foo { puts "hello" } # hello