【问题标题】:Accessing ruby method's symbol contained in a module访问模块中包含的 ruby​​ 方法的符号
【发布时间】:2016-11-24 10:14:01
【问题描述】:

鉴于 Ruby 2.2

module A
  def self.a
    "a"
  end
end

如何访问A.a,以便分配给变量并稍后调用它?

我尝试了以下方法:

x = A::a.to_sym
send x           # NoMethodError: undefined method `a' for main:Object

以下作品:

x = -> { A.a }
x.call

既然我在一个数组中有命名空间函数和非命名空间函数,有没有办法可以用send 做到这一点?

我真的不想用include A 污染命名空间

【问题讨论】:

  • 但是你的意图是什么......为什么你需要这样做?
  • 您上面的代码可以访问“a”,问题是您试图在 main 上调用 :a 并且该方法不存在
  • songyy,我有一个存在于不同命名空间中的函数列表,我想稍后执行。

标签: ruby metaprogramming ruby-2.2


【解决方案1】:

您可以使用method 方法获得一个可调用对象(即支持#call 的对象,就像一个proc):

a = A.method(:a)
a.call # Or a[] or a.() as you prefer.
# "a"

【讨论】:

  • 哎呀..同一时间..嗨:)
【解决方案2】:

A::a 是一个方法,所以你可以简单的做:

m = A.method :a
m.call # returns "a"

【讨论】:

    【解决方案3】:

    是的,你可以使用send

    A.send :a  #=> "a" 
    

    A.send "a" #=> "a" 
    

    【讨论】:

      猜你喜欢
      • 2015-05-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-01-06
      • 2011-09-24
      • 2017-12-19
      相关资源
      最近更新 更多