动态调用方法 (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
我知道这可能与
最近几天我一直在移植一个 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