2009-06-30 49 views
2

作爲一個有趣的項目,我在Ruby中實現了一個Beatnik解釋器。如果您從未聽說過Beatnik,那麼這是一種深奧的編程語言,其操作由源代碼中單詞的「拼字比分」指定。Ruby在條件下執行某個函數的一種巧妙方式

無論如何,實現需要針對不同的拼字遊戲得分發生不同的操作。這不是來具體實施,一個明顯的方法是一個if語句:

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

另一種方法是使用一個case語句:

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

但無論是這兩種方法給我的印象特別優雅,你能否提出一個實現這個的另一種方式?

+0

我愛堆棧溢出教我這樣的重要的東西。除此之外,我還有什麼可以學會的:「<5不做任何事情。Beatnik口譯員可以根據自己的判斷嘲笑你可憐的得分。」 +1! – RichieHindle 2009-06-30 00:11:18

+0

[一組可能的方法來創建和調用函數dynamicaly](http://stackoverflow.com/a/11112426/1468040) – wiki 2012-06-20 03:33:06

回答

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

commands[score].call(p1,p2) 

插入你的代碼來代替...的的,和你的參數場所P1的,P2。這將創建一個稱爲命令的散列,從整數分數到匿名函數( - >是lambda的縮寫)。然後根據分數查找適當的功能,並將其命名!

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和lambda之間的區別請看this。它幾乎是無害的;)

相關問題