作为一个有趣的项目,我正在Ruby中实现Beatnik解释器。如果您从未听说过Beatnik,那么它就是一种深奥的编程语言,其中的操作由源代码中单词的“scrabble score”指定。
无论如何,实施需要针对不同的拼字游戏分数进行不同的操作。这不是特别实现的,一个明显的方法是if语句:
if score == 1
...
elsif score == 2
...
else
...
end
另一种方法是使用case语句:
case score
when 1
...
when 2
...
else
...
end
但这两种方法都没有让我觉得特别优雅,你能否提出另一种实现方法呢?
答案 0 :(得分:9)
commands = {
1 => ->(p1,p2) {...},
2 => ->(p1,p2) {...},
3 => ->(p1,p2) {...},
}
commands[score].call(p1,p2)
插入代码代替...,您的参数代替p1,p2。这将创建一个称为命令的哈希,从整数分数到匿名函数( - >是lambda的缩写)。然后根据分数查找相应的功能,并调用它!
答案 1 :(得分:2)
您可以创建一个哈希,将分数映射到代码:
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之间的区别,请查看this。它几乎无害;)
答案 2 :(得分:1)
我确信Ruby以某种方式支持委托......我不知道Ruby,所以我不能提供正确语法的示例,但是想法是创建一个对函数的引用数组,然后调用数组:
lookupArray[score](param1, param2);