在Ruby中具有参数的嵌套块

时间:2014-09-10 15:34:05

标签: ruby block anonymous-function dsl

我有一些严重的麻烦来理解带有参数的块。 我想使用这种Ruby代码:

FooBar.foo do |foo_arg|
  bar do |bar_arg|
    define_method :hello!, foo_arg, bar_arg do
      "Hello, #{foo_arg} and #{bar_arg}!"
    end
  end
end

include FooBar
hello!(:Alice, :Bob) # => "Hello, Alice and Bob!"

为此,我添加了几行:

module FooBar
  def self.foo &foo_block
    instance_eval &foo_block
  end

  def self.bar &bar_block
    instance_eval &bar_block
  end
end

但是因为管道之间的参数是特殊的,所以我遇到了语法错误。谢谢你的帮助!

1 个答案:

答案 0 :(得分:3)

您的模块似乎正常工作。问题是您使用define_method。参数foo_argbar_arg必须是传递给define_method的块的一部分。

module FooBar
  def self.foo(&foo_block)
    instance_eval &foo_block
  end

  def self.bar(&bar_block)
    instance_eval &bar_block
  end

  foo do |foo_arg|
    bar do |bar_arg|
      define_method :hello! do |foo_arg, bar_arg|
        "Hello, #{foo_arg} and #{bar_arg}!"
      end
    end
  end
end

include FooBar
hello!(:Alice, :Bob) # => "Hello, Alice and Bob!"

应该做你想做的事。