3

ちょっとした楽しいプロジェクトとして、RubyでBeatnikインタープリターを実装しています。Beatnikのことを聞いたことがない場合は、ソースコード内の単語の「スクラブルスコア」によって操作が指定される難解プログラミング言語です。

とにかく、実装では、異なるスクラブルスコアに対して異なる操作を行う必要があります。これは特に実装するものではありません。明らかな方法の1つは、ifステートメントです。

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

別の方法は、caseステートメントを使用することです。

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

しかし、これら2つの方法のどちらも、特にエレガントだとは思いません。これを実装する別の方法を提案できますか?

4

3 に答える 3

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

commands[score].call(p1,p2)

...の代わりにコードを挿入し、p1、p2の代わりにパラメーターを挿入します。これにより、整数スコアから無名関数まで、コマンドと呼ばれるハッシュが作成されます(->はラムダの略です)。次に、スコアに基づいて適切な関数を検索し、それを呼び出します。

于 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の違いについては、これを見てください。それはほとんど無害です;)

于 2009-06-30T00:17:45.717 に答える
1

Rubyは何らかの形でデリゲートをサポートしていると確信しています...Rubyを知らないため、正しい構文でサンプルを提供することはできませんが、関数への参照の配列を作成してから、配列:

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