Как мне вызвать метод экземпляра из строки? - PullRequest
0 голосов
/ 30 января 2020

Допустим, у меня есть класс

class MyClass
  def sayMyName()
    puts "I am unknown"
  end
end

, и я сохранил имя этого метода в переменной: methodName = "saymyName"

Я хочу вызвать этот метод с помощью указанной выше переменной, что-то как это:

instance = MyClass.new
instance[methodName] 

Я знаю, что это можно вызвать с помощью макроса, но я не понимаю, как? Пожалуйста, кто-нибудь предоставит пример с объяснением.

Обновление 1

Для этого уже есть ответ: Динамический вызов методов (Crystal-lang) , но это не ответ как это сделать, когда методы внутри класса.

1 Ответ

1 голос
/ 02 февраля 2020

Я адаптировал приведенный в обновлении пример:

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

Рабочий пример

...