我如何访问参数?

时间:2012-09-30 19:17:40

标签: ruby arguments local-variables

我希望在另一个方法中使用一个方法,并返回参数而不需要提及参数名称,如下所示return_arguments

def foo a, b, *c
  ... # part a
  p return_arguments
  ... # part b
end

foo(1, "blah blah", :a, :b)
... # return from part a
# => [1, "blah blah", :a, :b]
... # return from part b

这可能吗?我发现可能会使用bindinglocal_variableseval,但我不确定如何将参数与上面part a中定义的其他局部变量区分开来。 local_variables是否有特定的排序规则?如果是这样,也许我可以与arity一起使用它来提取参数。

3 个答案:

答案 0 :(得分:1)

在方法中首先使用local_variables,即在设置任何局部变量之前,并保存结果供以后使用。

答案 1 :(得分:1)

可能最简单的事情就是这样:

def foo(*args)
  a, b, *c = *args
  # (...)
  p args
  # (...)
end

或相反:

def foo(a, b, *c)
  args = [a, b, *c]
  # (...)
  p args
  # (...)
end

我不确定你为什么反对至少提一次提到参数名称。在方法中分配“参数”(让保持完整的数组)或从解析的参数重建数组,这是最直接和可读的。

答案 2 :(得分:1)

这绝对是低效的,但这是一个解决方案(虽然你可能应该使用像@tadman提到的哈希):

set_trace_func proc { |e,_,_,i,b,_|
   if e == 'call'
      p = method(i).parameters
      @arguments = p.map {|p| eval(p[1].to_s,b)}
   end
}

def foo a, b, *c
   a = 50
   b = 3
   return @arguments
   a = 11
   b = 2
end

p foo(1, "blah blah", :a, :b)