ruby DSL : Can you pass a block to an object

标签 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 会产生其他结果。

最佳答案

当然可以。这是一个示例,尝试修改它:

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!

关于 ruby DSL : Can you pass a block to an object,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16226913/

相关文章:

ruby - 在 rspec 中描述。什么时候使用引号?

ruby-on-rails - 在哪里为 Rails 中的开发/暂存/生产设置主机名?

arrays - 如何使用 Ruby printf() 函数打印单个数组元素

java - 如何在DSL中访问Java的实例变量?

dsl - 领域特定语言和编译器

python - Python 中的微型 DSL 实现

spring-integration - 如何增加消息头

ruby-on-rails - 处理重复的数据库条目

ruby - 对于最大的回文乘积问题(Project Euler),递归中的堆栈级别太深

python - 如何从Elasticsearch获取单个字段计数