5

我注意到 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,这将使代码更加简洁。

4

2 回答 2

6

它不是一门课。它是一个定义在上面的方法Object(虽然也有一个同名的类CSV)。您链接的文档具有误导性。更好地解释了它。

你不能用一个模块来做那样的事情,但你可以定义一个接受一个块的方法。

于 2013-04-25T08:03:26.733 回答
1

您展示的示例不是没有方法调用的类。相反,它是在没有类的情况下调用的方法。sawa已经解释了它是如何工作的。

Ruby 2.0 引入了Refinements

您可以改进Object以添加自定义方法并像您问题的示例中那样使用它。

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

但是您应该三思而后行,因为这可能会使您的代码更加意大利面条式、程序化并且更少面向对象。

于 2013-04-25T08:15:25.933 回答