如何解释ruby文档中的方法“原型”?

时间:2013-07-11 17:22:05

标签: ruby

例如,在rails api中 出现以下内容:

form_tag(url_for_options = {}, options = {}, &block) 

来自C ++ / java背景,这表明所有3个参数都是必需的:两个哈希和一个块。然而,有许多这种方法的例子使用少于三个参数,第一个参数采用字符串的形式。方法模板如何指定每个参数的特征/类型以及需要哪些参数?是否有某些摘要文档描述了用于描述如何调用此类方法的约定?

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分配nilbin将分配:bang

您也可以仅传递foobaz的值,忽略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.