Вопрос по ruby, if-statement – Ruby умный способ выполнить функцию по условию

2

В качестве забавного проекта я реализую интерпретатор Beatnik в Ruby. Если вы никогда не слышали о Beatnik, то это эзотерический язык программирования, в котором операции определяются как «оценка скрэббла»; слов в исходном коде.

В любом случае, реализация требует другой операции для разных оценок скрэббл. Это не особенно для реализации, одним очевидным способом является утверждение if:

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

Другой способ - использовать оператор case:

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

Но ни один из этих двух методов не кажется мне особенно элегантным, можете ли вы предложить альтернативный способ реализации этого?

Я люблю Stack Overflow за то, что учил меня таким важным вещам, как этот. Как иначе я бы узнал, что & lt; 5 ничего не делает. Переводчик Beatnik может по вашему усмотрению издеваться над вашей плохой оценкой. & Quot; +1! RichieHindle

Ваш Ответ

3   ответа
8
commands = {
  1 => ->(p1,p2) {...},
  2 => ->(p1,p2) {...},
  3 => ->(p1,p2) {...},
}

commands[score].call(p1,p2)

а свои параметры вместо p1, p2. Это создаст хеш, называемый командами, от целочисленных результатов до анонимных функций (- & gt; сокращение от лямбда). Затем вы ищите подходящую функцию на основе оценки и вызываете ее!

Просто к вашему сведению: - & gt; вместо "лямбда" будет работать только в Ruby 1.9. В Ruby 1.8.x вам нужно будет выписать полную лямбду {| p1, p2 | ...}
1

что Ruby каким-то образом поддерживает делегатов ... Я не знаю Ruby, поэтому не могу предоставить пример с правильным синтаксисом, но идея состоит в том, чтобы создать массив ссылок на функцию, а затем вызвать массив:

lookupArray[score](param1, param2);
2

ScoreMapping = { 
  1 => lamda { do_some_stuff },
  2 => eval("do_some_other_stuff"),
  3 => Proc.new { some_thing_even_more_awesome }
}

Эвал не очень красив, но вы могли бы сделать некоторые другие вещи, такие как

eval "function_for_score_of_#{score}"

с этим. Учитывая счет == 1, это вызвало бы function_for_score_of_1.

Для разницы между proc и лямбда взглянуть наэтот, Это в основном безвредно;)

Похожие вопросы