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

时间:2009-06-30 00:06:06

标签: ruby if-statement switch-statement

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

无论如何,实施需要针对不同的拼字游戏分数进行不同的操作。这不是特别实现的,一个明显的方法是if语句:

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

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

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

但这两种方法都没有让我觉得特别优雅,你能否提出另一种实现方法呢?

3 个答案:

答案 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);