ruby - 如何使用反射获取参数名称

标签 ruby reflection

我想在 Ruby 中做一些相当繁重的反射。我想创建一个函数,该函数返回调用堆栈更高层的各种调用函数的参数名称(只要高一点就足够了,但为什么要停在那里?)。我可以使用 Kernel.caller,转到文件并解析参数列表,但这会很丑陋且不可靠。

我想要的功能将按以下方式工作:

module A
  def method1( tuti, fruity) 
    foo
  end
  def method2(bim, bam, boom)  
    foo
  end
  def foo
    print caller_args[1].join(",") #the "1" mean one step up the call stack
  end

end

A.method1
 #prints "tuti,fruity"
A.method2
 #prints "bim, bam, boom"

我不介意使用 ParseTree或用于此任务的一些类似工具,但查看 Parsetree,如何将其用于此目的并不明显。创建 C 扩展,如 this是另一种可能性,但如果有人已经为我做过,那就太好了。

我知道我可能需要某种 C 扩展。我想这意味着我的问题是哪种 C 扩展组合最容易工作。我不认为 caller+ParseTree 本身就足够了。

至于为什么我想这样做,而不是说“自动调试”,也许我应该说我想使用这个功能来自动检查函数的调用和返回条件:

def add x, y 
  check_positive
  return x + y
end

如果 xy 不是正值,check_positive 将抛出异常。显然,它的意义远不止于此,但希望这能提供足够的动力。

最佳答案

在 Ruby 1.9.2 中,您可以轻松获取任何 Proc 的参数列表(因此当然也可以获取任何 MethodUnboundMethod) 与 Proc#parameters:

A.instance_method(:method1).parameters # => [[:req, :tuti], [:req, :fruity]]

格式是一组符号对:类型(必需、可选、剩余、 block )和名称。

想要的格式,试试

A.instance_method(:method1).parameters.map(&:last).map(&:to_s)
  # => ['tuti', 'fruity']

当然,这仍然不能让您访问调用者。

关于ruby - 如何使用反射获取参数名称,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/622324/

相关文章:

ruby-on-rails - 我可以将 Ruby on Rails 中的方法限制为 POST 方法吗?

ruby - 在 Ruby 中读取 YAML 文件

ruby-on-rails - ActiveRecord update_attributes 忽略无效键

C# 反射和查找所有引用

反射:按字符串构造

java - 在byte buddy的MethodDelegation中高效获取调用者

ruby - 正则表达式问题 - 用空格替换所有前面没有制表符的换行符

ruby-on-rails - 处理 Rails 3.1 应用程序中不存在的路由

java - 为什么我不能检查我的类是否在 Web 应用程序中实现了我自己的接口(interface)?

java - 当测试在完全相同的语句处崩溃时,为什么调用堆栈会不同?