动态调用方法(Crystal-lang)

时间:2019-04-30 11:11:57

标签: crystal-lang

我知道这可能与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

有更好的解决方案吗?

1 个答案:

答案 0 :(得分: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