Ruby DSL:你可以将一个块传递给一个对象

时间:2013-04-26 00:31:18

标签: ruby dsl

我对Ruby很陌生,只是在探索DSL。我想知道这是否可以在Ruby中使用,如果是这样,那怎么会这样做?

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

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

对不起,如果有人问过这个问题。我不知道该搜索什么问题。搜索DSL会产生其他因素。

1 个答案:

答案 0 :(得分: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!