Es ist möglich, hinzufügen Methoden zu einer Klasse mit Modulen. Z. B.
class Test
include Singleton
end
Nr Dieser „Hinzufügen von Methoden zu einer Klasse“ nicht. include
macht einfach Singleton
die Oberklasse von Test
. Nichts mehr. Nichts wird "zu einer Klasse hinzugefügt". Es ist nur Vererbung.
Ist es möglich, dasselbe mit Methoden zu tun? Z. B.
class Test
include Singleton
def test
include Instructions_to_add_to_the_method
puts 'done'
end
end
Es gibt keine Methode Test#include
, so wird dies einfach raise
ein NoMethodError
.
class Test
include Singleton
def test
super
puts 'done'
end
end
module Instructions_to_add_to_the_method
def test
puts 'hi'
end
end
class Test
include Instructions_to_add_to_the_method
end
Test.instance.test
# hi
# done
Hinweis
dass auf diese Weise Vererbung in Ruby verwenden rückwärts ein wenig ist:
Wenn Test.instance.test
anrufen, ich will:
hi !
done
Das ist, was für die Vererbung ist. Wenn Sie so etwas wirklich brauchen, sollten Sie eine Sprache wie Beta verwenden, wo Vererbung auf natürliche Weise funktioniert.
Eine bessere Lösung wäre so etwas wie die Template Method Software Design Pattern sein, die in Ruby können zu einem Block ing etwas so einfache wie yield
sein:
class Test
include Singleton
def test
yield
puts 'done'
end
end
Test.instance.test { puts 'hi' }
# hi
# done
oder nimm ein Proc
als Argument:
class Test
include Singleton
def test(prc)
prc.()
puts 'done'
end
end
Test.instance.test(-> { puts 'hi' })
# hi
# done
oder indem eine Hook-Methode aufgerufen wird:
class Test
include Singleton
def test
extension_hook
puts 'done'
end
def extension_hook; end
end
class HookedTest < Test
def extension_hook
puts 'hi'
end
end
HookedTest.instance.test
# hi
# done
Ich möchte nicht eine andere Methode aufrufen, da es Probleme mit dem Umfang meiner Variablen geben würde.
Es gibt keine Variablen in Ihrem Code, daher kann es keine "Probleme" mit ihnen geben.
Nein, so funktioniert Ruby nicht. Module sind keine Makros. Sie könnten 'Module # prepend' oder' Module # include' in Verbindung mit 'super' verwenden, wenn Sie das erreichen möchten? –