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

无论如何,实现需要针对不同的拼字游戏分数进行不同的操作。这并不是特别需要实现,一种明显的方法是 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。这会创建一个名为命令散列,从整数分数匿名函数( - >是短期的拉姆达)。然后你查找基于分数相应的功能,并调用它!

其他提示

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

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支持代表以某种方式......我不知道红宝石,所以我不能提供正确的语法样本,但这个想法是创建引用数组给一个函数,然后调用到数组:

lookupArray[score](param1, param2);
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top