会社のSlackで"Rubyでも>や<などがオーバライドできるのか!"という発言をしたところ、C++のstd::coutが実装できるのではないか??と返されたのでやってみたらできた。
std = Class.new do class Cout def <<(other) if other == :endl puts $stdout.flush else $stdout.write(other) end self end end def self.cout Cout.new end def self.endl Object.new end end std::cout << "Hello, world!" << std::endl #=> Hello, world!
黒術っぽく見えるがメソッドチェインできるようにすればいいだけだった。 また、今回の学びとしてRubyにおいては::はレシーバーの特異メソッドを呼び出すという挙動があることを知った。 普段::使うことがないので新鮮だった*1。 std::endlでObject.newをするアイディアはChatGPTくんに教えてもらった。優秀。 ただ、マジレスするのはやめちくり…
*1:::Fileみたいな使い方は時々使う