动态调用方法(Crystal-lang)

问题描述 投票:2回答:1

我知道这可能是Any equivalent of Ruby's public_send method?的副本。我想解释一下我在做什么,也许有人可以提出建议。

在过去的几天里,我一直在移植一个ruby应用程序来学习Crystal。由于缺乏send,我不得不削减很多功能,但今天我已经在我的计划中击中了一条主干道。

我有一个哈希,它包含键击作为键,方法作为值。根据触发的键,调用适当的方法。这显然使用send来实现相同的功能。

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

我想知道我是否错过了什么。

我知道我可能用每个键对switch语句进行硬编码并调用适当的方法,但仍然不允许用户为方法分配密钥。这个非常大的开关盒方法有什么替代方案吗?

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

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

更好的解决方案?

crystal-lang
1个回答
2
投票

我不确定这种方式最简单方便(也许更有经验的开发人员会在下面纠正我),但我会使用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