【问题标题】:getting access to the variable name inside self.method_added访问 self.method_added 中的变量名
【发布时间】:2011-08-30 06:51:32
【问题描述】:

我相信 Ruby,有一种方法可以访问块内所有局部变量的名称。

def some_method(param1, param2)
  p local_variables
end

每当调用“some_method”时,param1 和 param2 都会被打印出来。不是价值!但变量名。

现在,我想在 self.method_add 中实现相同的结果。

只要定义了一个方法,就会调用 self.method_added。我希望能够访问在 self.method_add 中定义的方法的局部变量的名称。例如,

def self.method_added(method_name)
   #prints the variables names of the argument for method method_name
end

def do_something param1, param2
   #crazy stuff
end 

使用上面的代码,当 do_something 创建时,我想访问变量名“param1”和“param2”

有没有办法做到这一点?

【问题讨论】:

  • 查看this answer 以及同一问题的其他答案。它没有提供获取方法中使用的所有局部变量名称的方法,但它允许您获取给定方法名称的参数名称。
  • 请问您这样做的原因是什么?
  • 我想为子类的方法创建一种方法,以根据变量的名称检查其变量的类型。所以你可以说 stringName.. 它会检查它是否是一个字符串。
  • 那是相当违背红宝石哲学的。您应该使用鸭子类型来确保传递给方法的对象执行您想要的操作。我强烈推荐 Avdi Grimm 的演讲“Confident Code”,可在此处获取:confreaks.net/videos/614-cascadiaruby2011-confident-code
  • 是的,我不这样做是因为我想遵循 Ruby 的哲学。我只是想看看我能不能做到。

标签: ruby metaprogramming


【解决方案1】:
def self.method_added(method_name)
  p self.instance_method(method_name.to_sym).parameters.collect{|g| g[1]}
end

【讨论】:

    【解决方案2】:

    根据您的 ruby​​ 版本,您可能会考虑使用 ruby​​2ruby。

    见:http://www.slideshare.net/marc_chung/RubyConfRubyDosRuby

    它允许您获取代码的 AST(抽象语法树)。但上次我检查它只适用于 1.8。

    【讨论】:

      猜你喜欢
      • 2012-03-02
      • 1970-01-01
      • 1970-01-01
      • 2021-12-17
      • 2013-12-19
      • 1970-01-01
      • 2013-12-24
      • 2011-03-14
      • 1970-01-01
      相关资源
      最近更新 更多