动态调用方法 (Crystal-lang)

Calling methods dynamically (Crystal-lang)

我知道这可能与 重复。我想解释一下我在做什么,也许有人可以提供建议。

最近几天我一直在移植一个 ruby 应用程序来学习 Crystal。由于缺少 send,我不得不削减很多功能,但今天我在我的程序中遇到了一个主要问题。

我有一个散列,其中包含击键作为键,方法作为值。根据敲击的键,调用适当的方法。这显然使用 send 来实现相同的。

从链接的问题中,我了解到 Crystal 已编译,因此不允许动态方法调用。但是,如果您查看 Vim 编辑器,用户也可以将键映射到方法。而vi(m)是用C写的。

我想知道我是否遗漏了什么。

我知道我可以用每个键硬编码一个 switch 语句并调用适当的方法,但这仍然不允许用户将键分配给方法。除了这个非常大的 switch-case 方法之外,还有其他方法吗?

(我猜测我不会检查 when 部分中的密钥,而是检查绑定并调用方法。

 binding = @bindings[key]
 case binding
 when :up
    up
 when :down
    down
 when .....
 else
 end

有更好的解决方案吗?

我不确定这种方式是否最简单方便(也许更有经验的开发人员会在下面纠正我)但我会使用 Proc:

def method1
  puts "i'm  method1"
end

def method2
  puts "i'm method2"
end

def method3
  puts "i'm  method3"
end

hash = { 
  "ctrl":  -> { method1 },
  "shift": -> { method2 },
  "alt":   -> { method3 }
}

binding = ["ctrl", "shift", "alt"].sample
hash[binding].call #=> i'm method2

working example