Ruby:接受块的类?

时间:2013-04-25 07:58:38

标签: ruby

我注意到Ruby中的CSV类有一些快捷方式接口(参见http://ruby-doc.org/stdlib-1.9.3/libdoc/csv/rdoc/CSV.html):

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,这将使代码更清晰。

2 个答案:

答案 0 :(得分:6)

这不是一个班级。它是在Object上定义的方法(尽管还有一个名为CSV的类。)您链接的文档具有误导性。 This更好地解释了它。

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

答案 1 :(得分:1)

您展示的示例不是没有方法的类。相反,它是一个没有类的方法。 sawa 已经explained如何运作。

Ruby 2.0引入了Refinements

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

如果你坚持使用Ruby 1.9,你可以使用猴子补丁而不是精炼。

但你应该三思而后行,因为这可能会使你的代码变得更加笨拙,程序化,而且不那么面向对象。