重写简单的ruby函数以使用块

重写简单的ruby函数以使用块,ruby,function,yield,Ruby,Function,Yield,我不知道正确的术语。我试着用谷歌搜索它,但由于这个原因,我什么也找不到 我正在编写一个Ruby库,我想重写这些函数,使它们按照下面的方式工作,因为我更喜欢它的可读性(在块内?) 我有一个函数可以做到这一点 @dwg = Dwg.new("test.dwg") @dwg.line([0,0,0],[1,1,0]) @dwg.save 我想把它改写成这样 Dwg.new("test.dwg") do line([0,0,0],[1,1,0]) save end 你能概述一下我做这

我不知道正确的术语。我试着用谷歌搜索它,但由于这个原因,我什么也找不到

我正在编写一个Ruby库,我想重写这些函数,使它们按照下面的方式工作,因为我更喜欢它的可读性(在块内?)

我有一个函数可以做到这一点

@dwg = Dwg.new("test.dwg")
@dwg.line([0,0,0],[1,1,0])
@dwg.save
我想把它改写成这样

Dwg.new("test.dwg") do

   line([0,0,0],[1,1,0])
   save

end

你能概述一下我做这件事的方法吗?

你可以定义
Dwg
的初始值设定项来获取一个块,然后使用
instance\u eval
将其屈服于该块,如下所示:

class MyClass
  def initialize(name, &block)
    @name = name
    instance_eval &block
  end

  def show_name
    puts 'My name is ' + @name
  end
end

MyClass.new('mud') do
  show_name
end

# >> My name is mud

有关更多信息,请参阅Gregory Brown优秀著作最近获得知识共享许可的“界面简化块”部分。(这本书的作者和出版商正在逐步对整本书进行审查,但你当然可以买一本来支持这本书。iPhone版的价格特别便宜。)

如果您仍然希望支持在没有块的情况下调用
new
的情况,请确保将行
instance\u eval&block
更改为
instance\u eval&block,否则您将得到
ArgumentError:block not supplied
。如果您没有使用块,但是如果您使用块,它不是多余的吗?这一点很好,特别是因为我正在将文件名传递给函数