2009-06-30 5 views
2

Als ein bisschen ein lustiges Projekt implementiere ich einen Beatnik-Interpreter in Ruby. Wenn Sie noch nie von Beatnik gehört haben, ist es eine esoterische Programmiersprache, in der Operationen durch den "Scrabble Score" der Wörter im Quellcode spezifiziert werden.Ruby ein cleverer Weg, um eine Funktion unter einer Bedingung auszuführen

Die Implementierung erfordert jedoch eine andere Operation für unterschiedliche Scrabble-Scores. Das ist nicht besonders zu implementieren, ein offensichtlicher Weg ist eine if-Anweisung:

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

Eine weitere Möglichkeit, eine Case-Anweisung zu verwenden, wäre:

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

Aber keine dieser beiden Methoden erscheint mich als besonders elegant, können Sie einen alternativen Weg vorschlagen, dies zu implementieren?

+0

Ich liebe Stack Overflow, um mich über wichtige Sachen wie diese zu unterrichten. Wie sonst hätte ich gelernt, dass "<5 nichts tut. Der Beatnik-Interpreter kann Sie wegen Ihrer schlechten Bewertung verspotten, nach eigenem Ermessen." +1! – RichieHindle

+0

[eine Sammlung von Möglichkeiten zum Erstellen und Aufruf von Funktionen dynamisch] (http://StackOverflow.com/a/11112426/1468040) – wiki

Antwort

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

commands[score].call(p1,p2) 

Fügen Sie Ihren Code anstelle der ... 's und Ihre Parameter anstelle von P1, P2. Dies erzeugt einen Hash, der Befehle genannt wird, von Integer-Werten bis zu anonymen Funktionen (-> ist die Abkürzung für Lambda). Dann suchst du die passende Funktion basierend auf der Partitur aus und nennst sie!

+5

Nur zur Erinnerung: -> anstelle von "Lambda" wird nur in Ruby 1.9 funktionieren. In Ruby 1.8.x müssen Sie das volle Lambda {| p1, p2 | ...} –

1

Ich bin sicher, Ruby unterstützt Delegaten in irgendeiner Weise ... Ich kenne Ruby nicht, also kann ich kein Beispiel in korrekter Syntax bereitstellen, aber die Idee ist, ein Array von Verweisen auf eine Funktion zu erstellen, rufen Sie dann in das Array:

lookupArray[score](param1, param2); 
2

Sie könnten einen Hash, Mapping Noten Code erstellen:

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

Eval nicht sehr hübsch, aber man könnte wie

eval "function_for_score_of_#{score}" 

mit ihm einige andere Sachen zu tun. Bei einem Score == 1 würde es function_for_score_of_1 aufrufen.

Für den Unterschied zwischen Proc und Lambda einen Blick auf this. Es ist meistens harmlos;)

Verwandte Themen