2013-04-26 63 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

相关问题