将参数传递给ruby方法有哪些不同的可能性? PARAM / hashlist /阵列/ aproc?

时间:2012-01-27 05:59:28

标签: ruby

我试图更深入地理解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?

有人可以请我澄清一下

1 个答案:

答案 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