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

ADA*_*DAM 9 ruby yield function

我不知道正确的术语.我试图谷歌它,因为这个原因找不到任何东西.

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

我有一个功能,这样做

@dwg = Dwg.new("test.dwg")
@dwg.line([0,0,0],[1,1,0])
@dwg.save
Run Code Online (Sandbox Code Playgroud)

我想重写它,所以它的工作方式就像这样

Dwg.new("test.dwg") do

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

end
Run Code Online (Sandbox Code Playgroud)

你能概括一下我的方式吗?

und*_*ees 15

您可以定义Dwg初始化程序以获取块,然后使用instance_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
Run Code Online (Sandbox Code Playgroud)

有关更多信息,请参阅Gregory Brown 最近出色的Ruby Best Practices一书中最近Creative-Commons许可的第2章中的"用于界面简化的块"部分.(它的作者和出版商正在逐步整理所有内容,但你当然可以购买一份副本来支持这项工作.iPhone版本特别实惠.)

  • 一定要将`instance_eval&block`行更改为`instance_eval&block if block_given?`如果你仍然想支持在没有块的情况下调用`new`的情况,否则你会得到`ArgumentError:block not provided` . (11认同)