Comme d'autres l'ont déjà expliqué, le problème est simplement que old<<
n'est pas un identifiant légal Ruby. Vous pouvez, avec des astuces, créer une méthode avec ce nom, mais vous ne pouvez pas l'appeler de la manière habituelle, et elle ne sera certainement pas reconnue comme un opérateur.
Cependant, toutes les réponses jusqu'à présent, alors qu'ils ont certainement répondu à votre question, ont complètement ignoré le problème sous-jacente: cette méthode ne devrait même pas avoir un nom en premier lieu! Et s'il n'a pas de nom, alors le problème de l'illégalité du nom ne se pose même pas.
#!/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
Dans ce cas, la méthode ne fait jamais nommé, ce qui signifie non seulement que nous ne devons pas inventer un nom pour cela, cela signifie aussi qu'il ne pollue pas l'espace de noms.
OP semble triste: << – Nakilon