他の人がすでに説明しているように、問題は単純にそれold<<が正当な Ruby 識別子ではないということです。トリックを使用して、その名前のメソッドを作成できますが、通常の方法で呼び出すことはできず、演算子として認識されません。
ただし、これまでのすべての回答は、確かにあなたの質問に答えていますが、根本的な問題を完全に無視しています:そのメソッドにはそもそも名前さえあるべきではありません! また、名前がなければ、名前が違法であるという問題も発生しません。
#!/usr/bin/env ruby
require 'test/unit'
require 'stringio'
class TestOperatorDecorator < Test::Unit::TestCase
def setup; @old_stdout, $> = $>, (@fake_stdout = StringIO.new) end
def teardown; $> = @old_stdout end
def test_that_me_dot_append_writes_to_stdio
me = 'this is a string'
class << me
old_method = instance_method :<<
define_method :<< do |text|
old_method.bind(self).(text)
puts "appended #{text}"
end
end
me << 'Test'
assert_equal "appended Test\n", @fake_stdout.string
end
end
この場合、メソッドに名前が付けられることはありません。これは、メソッドの名前を発明する必要がないことを意味するだけでなく、名前空間を汚染しないことも意味します。