Ruby 如何允许方法参数默认值从早期的参数派生



在 Ruby 中,列表中首先传递的参数可用于为以后的参数定义默认值。

class Buddy
  def test opts, spec = opts[:red]
    puts spec
  end
end

n = Buddy.new
n.test( {:red => 3} )

这是什么魔法?
所有参数都是串行加载的吗?这种行为只适用于proc,而不是lambda吗?

方法调用会导致将参数分配给参数变量:

    do_stuff(10, 20)  #method call
def do_stuff( x, y )  #method definition
resulting assignments: x = 10, y = 20

参数变量是局部变量。 将值分配给局部变量后,可以访问局部变量。 参数变量赋值似乎与编写没有任何不同:

x = {a: 1, b: 2}
y = x[:a]
puts x, y
--output:--
{:a=>1, :b=>2}
1

此行为仅适用于 proc 吗

您的示例中哪里有 proc? 无论如何,

func = Proc.new do |x, y=x[:a]| 
  puts x, y  
end
func.call({a: 1, b: 2})
--output:--
{:a=>1, :b=>2}
1

λ:

func = lambda do |x, y=x[:a]| 
  puts x, y  
end
func.call({a: 1, b: 2})
--output:--
{:a=>1, :b=>2}
1

因此,参数变量赋值对方法、进程和 lambda 的工作方式相同。

最新更新