【问题标题】:Ruby: class accepting a block?Ruby:类接受一个块?
【发布时间】:2013-04-19 00:40:57
【问题描述】:

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

【问题讨论】:

    标签: ruby


    【解决方案1】:

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

    Ruby 2.0 引入Refinements

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

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

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

    【讨论】:

    • 感谢Refinement 链接。
    • refine 的全部目的是控制猴子补丁可见的范围。由于您希望这些 CSV 方法在任何地方都可见,因此没有必要使用细化。
    【解决方案2】:

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

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

    【讨论】:

      猜你喜欢
      • 2013-11-19
      • 2013-02-19
      • 2017-06-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-11-07
      • 1970-01-01
      相关资源
      最近更新 更多