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 に答える