ぶていのログでぶログ

思い出したが吉日

RubyでC++のstd::cout << "Hello, world!"" << std::endlを再現する

会社の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みたいな使い方は時々使う