例如,在 rails api 中会出现以下内容:
form_tag(url_for_options = {}, options = {}, &block)
来自 C++/java 背景,这表明所有 3 个参数都是必需的:两个散列和一个块。然而,有许多使用少于三个参数且第一个参数采用字符串形式的方法的示例。方法模板如何指定每个参数的特征/类型以及需要哪些参数?是否有描述用于描述如何调用此类方法的约定的摘要文档?
例如,在 rails api 中会出现以下内容:
form_tag(url_for_options = {}, options = {}, &block)
来自 C++/java 背景,这表明所有 3 个参数都是必需的:两个散列和一个块。然而,有许多使用少于三个参数且第一个参数采用字符串形式的方法的示例。方法模板如何指定每个参数的特征/类型以及需要哪些参数?是否有描述用于描述如何调用此类方法的约定的摘要文档?
在 Ruby 中,方法原型中的参数只有在没有指定默认值且不是块的情况下才需要。块总是可选的(尽管它们在方法实现方面可能不是可选的)。考虑以下:
def foo(bar, baz = nil, bin = :bang, &block)
在此示例中,bar
是必需的,因为如果未分配它,它不会收到默认值。如果您不想指定更多参数,则不必 - baz
will be assignednil
和bin
will be assigned :bang
。
foo
您也可以为 just和传递值baz
,忽略bin
并让它接收其默认值:foo(:some_bar, :some_baz)
.
如果你想传递一个值 for bin
,但不是 for baz
,你会卡住 - Ruby 不会让你传递参数 1 和 3 的值并跳过 2。要到达参数 3,你必须传递参数 2,所以你的调用可能是foo(:some_bar, nil, :boom)
.
如前所述,块始终是可选的。从语义上讲,可能需要一个块。例如,如果您有
def foo(&block)
yield
end
你调用 foo 没有块,你会收到LocalJumpError: no block given (yield)
. 如果您的方法需要一个块来运行,那么这可能是合适的,因为它会通知用户他们没有传递一个块。但是,如果该块可能是可选的,那么您可以测试是否通过了block_given?
,因此您可以根据是否通过参数来调整方法的实现。
没有通常意义上的原型。在你的例子中
form_tag(url_for_options = {}, options = {}, &block)
该form_tag
方法最多需要两个参数,但由于为它们都提供了默认值,因此可以在没有任何参数的情况下调用它。ArgumentError
如果一个方法被调用时使用的参数多于指定的参数,或者参数少于没有默认值的参数,Ruby 会引发一个。
任何默认参数值的类型都与调用该方法时可能传递的内容无关,并且类似 的调用form_tag(Math::PI, false)
虽然不太可能做任何有用的事情,但可以正常编译。
在形式参数中指定块的效果是赋予对调用中提供的任何块的命名访问权限。通常更适合在yield
方法中执行块并将值传入和传出。调用方法时,块始终是可选的。
任何类型都可以是参数。前两个参数将默认为空哈希,'&' 变量将捕获块。这很好地解释了默认参数。