Ruby是一种在条件上执行函数的聪明方法

作为一个有趣的项目,我正在Ruby中实现Beatnik解释器。 如果您从未听说过Beatnik,那么它就是一种深奥的编程语言,其中的操作由源代码中单词的“scrabble score”指定。

无论如何,实现需要针对不同的拼字游戏分数进行不同的操作。 这不是特别实现的,一个明显的方法是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。 这将创建一个称为命令的哈希,从整数分数到匿名函数( – >是lambda的缩写)。 然后根据分数查找相应的function,并调用它!

您可以创建一个哈希,将分数映射到代码:

 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以某种方式支持委托……我不知道Ruby,所以我不能提供正确语法的示例,但是想法是创建一个对函数的引用数组,然后调用数组:

 lookupArray[score](param1, param2);