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

Ruby如何允许从早期的参数派生方法param默认值?,ruby,methods,parameters,computer-science,Ruby,Methods,Parameters,Computer Science,在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

在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的作用是相同的