3

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

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

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

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

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

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

4

3 回答 3

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

commands[score].call(p1,p2)

用你的代码代替...,用你的参数代替p1,p2。这将创建一个称为命令的哈希,从整数分数到匿名函数(-> 是 lambda 的缩写)。然后根据分数查找相应的函数,然后调用它!

于 2009-06-30T00:15:42.460 回答
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。它大多是无害的;)

于 2009-06-30T00:17:45.717 回答
1

我确信 Ruby 以某种方式支持委托...我不了解 Ruby,所以我无法提供正确语法的示例,但想法是创建一个对函数的引用数组,然后调用大批:

lookupArray[score](param1, param2);
于 2009-06-30T00:11:55.243 回答