3

我对 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 会产生其他东西。

4

1 回答 1

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!
于 2013-04-26T01:26:41.623 回答