0

我希望一个方法在另一个方法中使用并返回参数而不需要提及参数名称,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

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

4

3 回答 3

1

在方法中使用local_variables第一件事,即在设置任何局部变量之前,并保存结果以备后用。

于 2012-09-30T19:30:33.407 回答
1

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

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

或者反过来:

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

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

于 2012-09-30T19:43:34.847 回答
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)
于 2012-10-05T02:36:44.097 回答