2009-06-30 25 views
2

作为一个有趣的项目,我在Ruby中实现了一个Beatnik解释器。如果您从未听说过Beatnik,那么这是一种深奥的编程语言,其操作由源代码中单词的“拼字比分”指定。Ruby在条件下执行某个函数的一种巧妙方式

无论如何,实现需要针对不同的拼字游戏得分发生不同的操作。这不是来具体实施,一个明显的方法是一个if语句:

if score == 1 
... 
elsif score == 2 
... 
else 
... 
end 

另一种方法是使用一个case语句:

case score 
when 1 
    ... 
when 2 
    ... 
else 
    ... 
end 

但无论是这两种方法给我的印象特别优雅,你能否提出一个实现这个的另一种方式?

+0

我爱堆栈溢出教我这样的重要的东西。除此之外,我还有什么可以学会的:“<5不做任何事情。Beatnik口译员可以根据自己的判断嘲笑你可怜的得分。” +1! – RichieHindle 2009-06-30 00:11:18

+0

[一组可能的方法来创建和调用函数dynamicaly](http://stackoverflow.com/a/11112426/1468040) – wiki 2012-06-20 03:33:06

回答

8
commands = { 
    1 => ->(p1,p2) {...}, 
    2 => ->(p1,p2) {...}, 
    3 => ->(p1,p2) {...}, 
} 

commands[score].call(p1,p2) 

插入你的代码来代替...的的,和你的参数场所P1的,P2。这将创建一个称为命令的散列,从整数分数到匿名函数( - >是lambda的缩写)。然后根据分数查找适当的功能,并将其命名!

1

我确定Ruby以某种方式支持委托......我不知道Ruby,所以我不能提供正确语法的示例,但其想法是创建一个对函数的引用数组,然后调用到数组:

lookupArray[score](param1, param2); 
2

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

ScoreMapping = { 
    1 => lamda { do_some_stuff }, 
    2 => eval("do_some_other_stuff"), 
    3 => Proc.new { some_thing_even_more_awesome } 
} 

评估和演示是不是很漂亮,但你可以做一些其他的东西一样

eval "function_for_score_of_#{score}" 

它。给定分数== 1,它会调用function_for_score_of_1。

对于proc和lambda之间的区别请看this。它几乎是无害的;)

相关问题