Soru Ruby'de bir null-stream gibi bir şey var mı?


Kullanabilirim:

File.open('/dev/null', 'w')

Unix sistemlerinde, ancak bunu başarmak için bir Ruby yolu varsa, kullanmak istiyorum. Sadece bir IO Akışı arıyor, hemen yazıyor "tüm yazıyor", bir null nesnesi gibi.


24
2017-12-30 16:54


Menşei


Eğer zaten olmayan biri varsa, birini yapmak çok kolay olur. Sadece hiçbir şey yapmadan yazma yöntemleriyle bir sınıfa sahip ol. - cHao
Bu Windows, Linux ve Mac OS üzerinde iyi çalışması gerekir. - the Tin Man
sadece bu noktayı buldum gist.github.com/369632 - maprihoda
Bu konuda emin misin? - Marian Theisen
Teşekkürler @maprihoda, bu yararlı olabilir. - Marian Theisen


Cevaplar:


Hayır, en azından önceki sürümlerinde Ruby'de boş bir akış gibi bir şey olmadığına inanmıyorum. Bu durumda, kendiniz bir tane yapmalısınız. Arayacağı yöntemlere bağlı olarak yazmanız gerekecek. null akış sınıfındaki saplama yöntemleri, şöyle:

class NullStream
   def <<(o); self; end
end

Yukarıdaki örnek hiçbir şekilde eksiksiz değildir. Örneğin, bazı akışların aranması gerekebilir write, puts veya diğer yöntemler. Ayrıca, bazı yöntemler iade edilerek uygulanmalıdır. self kendi yöntemlerinde <<Diğerleri değil.


5
2017-12-30 17:03



Olması gereken def <<(o); self end düzgün çalışması için null_stream << foo << bar kırılacak). - sepp2k
Bu sadece geçersiz kılmanız durumunda çalışır puts, print, write, vb... - Linuxios
Neden oy kullandım? - Peter O.
Bu, sistem düzeyinde değil (gerçek akışlar, fd, aygıt dosyaları, vb.), Yalnızca uygulama veya kullanıcı düzeyinde (sanal veya sahte akışlar, dize IO'lar vb.) Çıktıları geçersiz kılar. Marc-André Lafortune'un cevabı muhtemelen daha uygun. - konsolebox


Akışların tam davranışını istiyorsanız, en iyisi muhtemelen:

File.open(File::NULL, "w")

Bunu not et File::NULL Ruby 1.9.3'te yeni; sen benimkini kullanabilirsin backports taş:

require 'backports/1.9.3/file/null' # => Won't do anything in 1.9.3+
File.open(File::NULL, "w")          # => works even in Ruby 1.8.6

Ayrıca kopyalayabilirsiniz ilgili kod Eğer tercih edersen.


69
2017-12-30 17:10



bunu söylediğin için teşekkürler - Marian Theisen
+1 Bu ihtiyaç var! - d11wtq
Bu mükemmel. Ben böyle kullanıyorum: STDNULL = File.open(File::NULL, 'w') sonra her yerde STDNULL kullanıyorum - Jagtesh Chadha


Sahte bir filestream tanıtmak istediğimde faydalı bulduğum stringIO var:

require "stringio"
f = StringIO.new
f.gets # => nil

ve burada, hem unix hem de windows için bit kovasını biraz değiştirilen heckle'dan bazı kodlar:

# Is this platform MS Windows-like?
# Actually, I suspect the following line is not very reliable.
WINDOWS = RUBY_PLATFORM =~ /mswin/
# Path to the bit bucket.
NULL_PATH = WINDOWS ? 'NUL:' : '/dev/null'

7
2018-04-10 04:42



StringIO.new trick + 1'imi alır, çünkü bir dosya tanıtıcıyı açmaz gibi görünebilir, bu nedenle belki de açık kapanmaya gerek yoktur: stackoverflow.com/questions/4795447/... - Martin Dorey
Yine de girişi engellemez, dolayısıyla kullanım durumunuza bağlı olarak bir bellek sızıntısına neden olma potansiyeli vardır. - Xavier Shay


Adında bir mücevher var devnull

Null dosyasının Ruby uygulanması (Un * x, NUL üzerinde / dev / null gibi)   Windows)

Null dosyasıyla etkileşime girmez, bunun yerine IO nesnelerinin uyguladığı tüm yöntemler için kukla yöntemler vardır.


1
2018-05-21 23:41