例如,在rails api中 出现以下内容:
form_tag(url_for_options = {}, options = {}, &block)
来自C ++ / java背景,这表明所有3个参数都是必需的:两个哈希和一个块。然而,有许多这种方法的例子使用少于三个参数,第一个参数采用字符串的形式。方法模板如何指定每个参数的特征/类型以及需要哪些参数?是否有某些摘要文档描述了用于描述如何调用此类方法的约定?
答案 0 :(得分:0)
通常意义上没有原型。在你的例子中
form_tag(url_for_options = {}, options = {}, &block)
form_tag
方法最多需要两个参数,但由于为这两个参数提供了默认值,因此可以在不使用任何参数的情况下调用它们。如果使用比指定的参数多的参数调用方法,或者参数少于没有默认值的参数,Ruby会引发ArgumentError
。
任何默认参数值的类型与调用方法时可能传递的内容无关,而form_tag(Math::PI, false)
之类的调用虽然不太可能做任何有用的事情,但编译正常。
在形式参数中指定块只会对调用中提供的任何块提供命名访问权限。通常更合适的做法是使用方法中的yield
执行块并将值传递给它或从中传递值。调用方法时,块总是可选。
答案 1 :(得分:0)
在Ruby中,方法原型中的参数仅在未分配默认值且不是块时才需要。块总是可选的(尽管它们在方法实现方面可能不是可选的)。请考虑以下事项:
def foo(bar, baz = nil, bin = :bang, &block)
在此示例中,bar
是必需的,因为如果未分配,则不会收到默认值。如果您不想指定其他参数,则不必为baz
分配nil
,bin
将分配:bang
。
您也可以仅传递foo
和baz
的值,忽略bin
并让它接收默认值:foo(:some_bar, :some_baz)
。
如果你想为bin
传递一个值,而不是为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?
传递了一个块,因此您可以根据是否传递参数来调整方法的实现。
答案 2 :(得分:-1)
任何类型都可以作为参数。前两个参数将默认为空哈希和'&'变量将捕获块。 This explains default arguments pretty well.