2013-04-25 50 views
5

我注意到,在Ruby中CSV类有一些快捷接口(见http://ruby-doc.org/stdlib-1.9.3/libdoc/csv/rdoc/CSV.html):Ruby:类接受一个块?

CSV    { |csv_out| csv_out << %w{my data here} } # to $stdout 
CSV(csv = "") { |csv_str| csv_str << %w{my data here} } # to a String 
CSV($stderr) { |csv_err| csv_err << %w{my data here} } # to $stderr 
CSV($stdin)  { |csv_in| csv_in.each { |row| p row } } # from $stdin 

有没有办法为我自己的类做到这一点?我正在实现一个DSL,这将使代码更清洁。

回答

6

这不是一个类。它是在Object上定义的一种方法(虽然也有一个类叫做CSV)。您链接的文档具有误导性。 This可以更好地解释它。

你不能像模块那样做,但你可以定义一个需要一个块的方法。

1

您显示的示例不是没有方法调用的类。相反,这是一种没有课堂的方法。 sawa已经explained它是如何工作的。

Ruby 2.0引入Refinements

您可以细化Object以添加自定义方法并在您的问题的示例中使用它。

如果你被困在Ruby 1.9上,你可以使用猴子修补而不是细化。

但是你应该三思而行,因为这可能会使你的代码更加spagheish,程序性和面向对象。

+0

感谢您的“细化”链接。 – 2013-04-25 08:20:31

+2

“精炼”的目的是为了控制猴子斑块的可见范围。既然你想让这些'CSV'方法在任何地方都可见,那么使用细化就没有意义了。 – 2013-04-25 08:24:56