2013-04-26 1 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'? –

+0

@MichaelDurrant Предположим, что существует метод внутри класса 'Player':' def on (event) ... ' – garbagecollector

ответ

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

+0

Можно ли вызвать отправку блока после инициализации? как спросил DumpHole? –

+0

Кроме того, это генерирует 'NoMethodError''''' для' main: Object' в ruby ​​1.9.3 –