如何从字符串中调用实例方法?

3
假设我有一个类:
class MyClass
  def sayMyName()
    puts "I am unknown"
  end
end

我已经将这个方法名存储在一个变量中:methodName = "saymyName"

我想要通过使用上面的变量来调用这个方法,就像这样:

instance = MyClass.new
instance[methodName] 

我知道可以使用宏来调用,但我不知道怎么做?请有人提供一个带解释的示例。

更新1

已经有一个答案了:动态调用方法(Crystal-lang),但是当方法在类内部时,这个答案并没有解决问题。


很遗憾,看起来你不能这样做:https://stackoverflow.com/a/48521707/9288880 - WPeN2Ic850EU
那里写着我们可以使用宏来完成,但没有说明如何实现? - Ujjwal Kumar Gupta
如何最好地解决它很大程度上取决于您的应用程序/库/特定需求。通常,您可以避免首先需要像这样的东西。当前问题过于泛泛而论,并且是由@WPeN2Ic850EU链接的重复问题。 - Jonne Haß
1
请参阅动态调用方法(Crystal-lang) - Jonne Haß
谢谢Jonne,但那个答案没有考虑到类的情况。如果方法在类中,应该怎么做呢? - Ujjwal Kumar Gupta
1个回答

3
我已经根据更新中给出的示例进行了调整:
class Foo
  def method1
    puts "i'm  method1"
  end

  def method2
    puts "i'm method2"
  end

  def method3
    puts "i'm  method3"
  end

  def bar
    { "ctrl":  -> { method1 },
      "shift": -> { method2 },
      "alt":   -> { method3 }
    }
  end

  def [](method)
    bar[method]
  end
end

binding = ["ctrl", "shift", "alt"].sample
foo = Foo.new
foo[binding].call #=> one of them

工作示例


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接