代码之家  ›  专栏  ›  技术社区  ›  yegor256

如何在Ruby中定义块的方法?

  •  1
  • yegor256  · 技术社区  · 10 月前

    我正在努力使这个工作(这是一个简化的例子):

    console do
      say "Hello"
      say "Bye"
    end
    

    在这里,我想以某种方式 say 方法仅在提供给的块内部可用 console 方法您将如何定义 安慰 方法,假设 简单地将参数打印到stdout?

    2 回复  |  直到 10 月前
        1
  •  3
  •   Stefan    10 月前

    您可以使用 instance_eval 在响应的对象的上下文中评估块 say 。该对象可以是提供DSL的类的实例,例如:

    class DSL
      def say(arg)
        puts arg
      end
    end
    
    def console(&block)
      dsl = DSL.new
      dsl.instance_eval(&block)
    end
    
    console do
      say "Hello"
      say "Bye"
    end
    
        2
  •  2
  •   Rajagopalan    10 月前
    def console(&block)
      Class.new do
        def say(message)
          puts message
        end
      end.new.instance_eval(&block)
    end
    

    def console(&block)
      context = Object.new
    
      context.define_singleton_method(:say) do |message|
        puts message
      end
    
      context.instance_eval(&block)
    end
    

    然后

    console do
      say "Hello"
      say "Bye"
    end