Ruby 是一种根据条件执行函数的巧妙方法
-
21-08-2019 - |
题
作为一个有趣的项目,我正在用 Ruby 实现 Beatnik 解释器。如果您从未听说过 Beatnik,那么它是一种深奥的编程语言,其中的操作由源代码中单词的“拼字游戏分数”指定。
无论如何,实现需要针对不同的拼字游戏分数进行不同的操作。这并不是特别需要实现,一种明显的方法是 if 语句:
if score == 1
...
elsif score == 2
...
else
...
end
另一种方法是使用 case 语句:
case score
when 1
...
when 2
...
else
...
end
但这两种方法都没有给我带来特别优雅的感觉,您能建议另一种实现此方法的方法吗?
解决方案
commands = {
1 => ->(p1,p2) {...},
2 => ->(p1,p2) {...},
3 => ->(p1,p2) {...},
}
commands[score].call(p1,p2)
将取代...的你的代码,你的参数场所P1的,P2。这会创建一个名为命令散列,从整数分数匿名函数( - >是短期的拉姆达)。然后你查找基于分数相应的功能,并调用它!
其他提示
您可以创建一个哈希,将分数映射到代码:
ScoreMapping = {
1 => lamda { do_some_stuff },
2 => eval("do_some_other_stuff"),
3 => Proc.new { some_thing_even_more_awesome }
}
Eval 不是很漂亮,但是你可以做一些其他的事情,比如
eval "function_for_score_of_#{score}"
用它。给定分数 == 1,它将调用 function_for_score_of_1。
对于 proc 和 lambda 之间的区别,请看一下 这. 。它基本上是无害的;)
我敢肯定,Ruby支持代表以某种方式......我不知道红宝石,所以我不能提供正确的语法样本,但这个想法是创建引用数组给一个函数,然后调用到数组:
lookupArray[score](param1, param2);
不隶属于 StackOverflow