2013-04-25 21 views
5

I (http://ruby-doc.org/stdlib-1.9.3/libdoc/csv/rdoc/CSV.html bakınız) Ruby CSV sınıfı bazı kısayol arayüzleri olduğunu fark ettik:Ruby: sınıf bir bloğu kabul ediyor mu?

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 

kendi sınıfları için bunu yapmanın bir yolu var mı? Bir DSL uyguluyor ve bu kodları çok daha temiz hale getiriyor.

cevap

6

Bu bir sınıf değil. Object'da tanımlanan bir yöntemdir (Aynı adda CSV ile adlandırılmış bir sınıf olsa da). Bağladığınız doküman yanıltıcıdır. This bunu daha iyi açıklıyor.

Bunu bir modülle yapamazsınız, ancak bir blok alan bir yöntem tanımlayabilirsiniz.

1

Gösterdiğiniz örnek, yöntemsiz çağrılan bir sınıf değil. Aksine, sınıfsız olarak adlandırılan bir yöntemdir. sawa zaten çalışıyor explained nasıl çalışır.

Ruby 2.0, Refinements ürününü tanıtmaktadır.

Özel bir yöntem eklemek ve sorusundaki örnekteki gibi kullanmak için Object öğesini hassaslaştırabilirsiniz.

Eğer Ruby 1.9'da takılırsanız, rafine etmek yerine maymun yamalarını kullanabilirsiniz.

Ama iki kez düşünmelisiniz çünkü bu, kodunuzu daha fazla spaghettish, yordamsal ve daha az nesne odaklı hale getirebilir.

+0

'Refinement' bağlantısı için teşekkürler. –

+2

"Rafine" nin bütün amacı, maymun yamaunun görülebileceği alanı kontrol etmektir. Bu "CSV" yöntemlerinin her yerden görülebilmesini istediğinizden, bir ayrıntılandırma kullanmanın hiçbir anlamı yoktur. –

İlgili konular