【问题标题】:Ruby a clever way to execute a function on a conditionRuby 一种在条件下执行函数的巧妙方法
【发布时间】:2009-06-30 00:06:05
【问题描述】:

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

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

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

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

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

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

【问题讨论】:

标签: ruby if-statement switch-statement


【解决方案1】:
commands = {
  1 => ->(p1,p2) {...},
  2 => ->(p1,p2) {...},
  3 => ->(p1,p2) {...},
}

commands[score].call(p1,p2)

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

【讨论】:

  • 仅供参考:-> 而不是“lambda”只能在 Ruby 1.9 中使用。在 Ruby 1.8.x 中,您需要写出完整的 lambda {|p1, p2| ... }
【解决方案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}"

有了它。给定 score == 1,它将调用 function_for_score_of_1。

有关 proc 和 lambda 之间的区别,请查看this。它大多是无害的;)

【讨论】:

    【解决方案3】:

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

    lookupArray[score](param1, param2);
    

    【讨论】:

      猜你喜欢
      • 2021-07-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-02-28
      • 1970-01-01
      • 2018-01-20
      • 1970-01-01
      相关资源
      最近更新 更多