当前位置:  开发笔记 > 编程语言 > 正文

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

如何解决《如何使用反射获取参数名称》经验,为你挑选了2个好方法。

我想在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扩展是另一种可能性,但如果有人已经为我做了它会很好.

我可以看到我可能需要某种C扩展.我想这意味着我的问题是C扩展的哪种组合最容易起作用.我不认为来电者+ ParseTree本身就足够了.

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

def add x, y 
  check_positive
  return x + y
end

其中check_positive,如果将抛出一个异常,xy不是积极的.显然,它会有更多,但希望这给了足够的动力.



1> Jörg W Mitta..:

在Ruby 1.9.2中,您可以通过以下方式轻松获取任何参数列表Proc(当然也可以是任何Method或者UnboundMethod)Proc#parameters:

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

格式是符号对的数组:类型(必需,可选,休息,块)和名称.

对于您想要的格式,请尝试

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

当然,这仍然无法让您访问调用者.


默认值是动态评估的,您无法获取有关它们的静态信息.什么应该`def foo(par = rand()); 方法(:foo).parameters`返回?

2> Antti Tarvai..:

我建议你看看Merb的action-args库.

require 'rubygems'
require 'merb'

include GetArgs

def foo(bar, zed=42)
end

method(:foo).get_args # => [[[:bar], [:zed, 42]], [:zed]]

如果您不想依赖Merb,您可以从github中的源代码中选择并选择最好的部分.

推荐阅读
李桂平2402851397
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有