2013-04-26 64 views
3

我對Ruby相當陌生,只是隨DSL一起探索。我想知道這是否可以在Ruby中使用,如果是這樣的話,那麼如何做到這一點?Ruby DSL:你可以通過一個塊到一個對象

melissa = Player.new 
melissa do 
    on :turn do 
    puts "It's my turn!" 
    end 

    on :win do 
    puts "I win! Hahahaha" 
    end 
end 

對不起,如果這之前已經詢問過。我不知道該搜索這個問題。搜索DSL會產生其他的東西。

+0

什麼是'on'結構? – 2013-04-26 00:43:34

+0

@MichaelDurrant讓我們假設'Player'類中有一個方法:'def on(event)...' – garbagecollector 2013-04-26 00:46:03

回答

2

當然可以。以下是一個示例,請嘗試對其進行修改:

class Player 
    def initialize(&block) 
     @actions = {} 
     instance_eval &block 
    end 
    def on(action, &block) 
     @actions[action] = block 
    end 
    def act(action) 
     @actions[action].call if @actions[action] 
    end 
end 

melissa = Player.new do 
    on :turn do 
    puts "It's my turn!" 
    end 

    on :win do 
    puts "I win! Hahahaha" 
    end 
end 

melissa.act :turn #=> It's my turn! 
+1

令人驚歎!我其實自己也想出了這個解決方案。 :) – garbagecollector 2013-04-26 01:30:43

+0

初始化後可以調用發送塊嗎? DumpHole如何問? – 2013-04-26 01:43:21

+0

另外,這會在ruby 1.9.3中爲main:Object引發'NoMethodError'' – 2013-04-26 01:49:12

相關問題