在Ruby中使用yield-inside_方法

在Ruby中使用yield-inside_方法,ruby,metaprogramming,Ruby,Metaprogramming,是否可以使yield关键字在给定的块内工作以定义_方法?简单的例子: class Test define_method :test do |&b| puts b # => #<Proc:...> yield end end Test.new.test { puts "Hi!" } 我想这就是你想要的: class Test define_method :test do |&b| b.call end end

是否可以使yield关键字在给定的块内工作以定义_方法?简单的例子:

class Test
  define_method :test do |&b|
    puts b    # => #<Proc:...>
    yield
  end
end

Test.new.test {
  puts "Hi!"
}

我想这就是你想要的:

class Test
  define_method :test do |&b|
    b.call
  end
end

Test.new.test {
  puts "Hi!"
}

更多信息,请参见您不能在
define_方法
块内使用
yield
。这是因为块由闭包捕获,请注意:

def hello
  define_singleton_method(:bye) { yield }
end

hello { puts "hello!" }

bye {  puts "bye!" } #=> "hello!"
我不认为您的用户会介意不能以您所说的方式使用“yield”——语法与普通的Ruby方法定义语法完全不同,因此不太可能有任何混淆


关于为什么不能将块隐式传递给此处找到的方法的更多信息:

不幸的是,这不是我想要的。我知道我可以这样调用block,但我需要使用yield。b变量仅用于指示该块已实际给定。@Dejw,这就是您要查找的droid。将&block作为参数并对其调用block.call与调用“yield”具有相同的语义。比灵顿的代码在1.8.7和1.9中都能工作。@Wayne:你可能认为这是解决方案,但事实并非如此。我没有写使用
yield
而不是
block.call
的目的,原因现在在我的问题中。@Dejw,谢谢你的补充解释。我必须承认,我仍然感到困惑:block.call不仅具有与yield相同的语义,而且对于调用者具有完全相同的语法(参见Beerlington的代码:他没有将block作为参数传入)。调用方无法判断该方法使用的是哪一个。我遗漏了什么?问题是调用方可能会编写
yield
,而不是
block.call
。我给出的代码可能是调用方的代码。我的库中的扩展方法定义可以简化为上面的代码。客户机提供了用于定义_方法(方法体)的块,所以他/她可以在那里写任何东西。尤其是
产量
。我可以在文档中编写
yield
根本不起作用的文档,但我正在努力避免这种情况,并使我的库与Ruby 100%兼容(允许使用任何语言语法,而不仅仅是子集)。哇,感谢您的解释,我想知道它为什么不起作用。这应该是公认的答案,不是回答,而是相关的:您不能在
定义方法中测试
给定的块
。测试块,如下所示:
def hello
  define_singleton_method(:bye) { yield }
end

hello { puts "hello!" }

bye {  puts "bye!" } #=> "hello!"