Reputation: 137
I've noticed that CSV class in Ruby has some shortcut interfaces (see 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
Is there a way to do this for my own classes? I am implementing a DSL and that would make code much more cleaner.
Upvotes: 5
Views: 120
Reputation: 23873
The example you showed is not a class called without a method. On the opposite, it is a method called without a class. sawa has already explained how it works.
Ruby 2.0 introduced Refinements.
You could refine Object
to add a custom method and use it like in the example from your question.
If you're stuck on Ruby 1.9, you can use monkey patching instead of refining.
But you should think twice because this might make your code more spaghettish, procedural and less object-oriented.
Upvotes: 1