Wie definiere ich dynamisch eine Klasse in Ruby mit einem Namen?Dynamische Klassendefinition mit einem Klassennamen
Ich weiß, wie eine Klasse dynamisch ohne einen Namen wie etwas mit erstellen:
dynamic_class = Class.new do
def method1
end
end
Aber man kann nicht einen Klassennamen angeben. Ich möchte eine Klasse dynamisch mit einen Namen erstellen.
Hier ist ein Beispiel, was ich tun möchte, aber natürlich funktioniert es nicht wirklich.
(Beachten Sie, dass ich nicht eine Instanz einer Klasse, sondern eine Klassendefinition erschaffe)
class TestEval
def method1
puts "name: #{self.name}"
end
end
class_name = "TestEval"
dummy = eval("#{class_name}")
puts "dummy: #{dummy}"
dynamic_name = "TestEval2"
class_string = """
class #{dynamic_name}
def method1
end
end
"""
dummy2 = eval(class_string)
puts "dummy2: #{dummy2}" # doesn't work
tatsächlichen Ausgang:
dummy: TestEval
dummy2:
gewünschte Ausgabe:
dummy: TestEval
dummy2: TestEval2
==== =================================================
Antwort: Eine völlig dynamische Lösung unter Verwendung der Methode sepp2k
dynamic_name = "TestEval2"
Object.const_set(dynamic_name, Class.new)
dummy2 = eval("#{dynamic_name}")
puts "dummy2: #{dummy2}"
Ich verstehe nicht wirklich, was Sie erreichen möchten. Es gibt eine Klasse TestEval2, danach können Sie test_eval2 = TestEval2.new durchführen. Und: Klasse A ... end liefert immer nil, also ist deine Ausgabe ok, denke ich ;-) – Philip
Das ist für einen TDD-Testschritt. Ich muss eine Testklasse dynamisch erstellen und dann auf ihren Namen verweisen, weil sie so in der freien Wildbahn verwendet wird. Sepp2K hat es richtig gemacht. –
@Philip: 'class A ... end' bewertet * nicht * zu' nil', wertet den Wert des zuletzt ausgewerteten Ausdrucks aus, genau wie jeder andere zusammengesetzte Ausdruck (Blöcke, Methoden, Moduldefinitionen, Ausdruck) Gruppen) in Ruby. Es ist einfach so, dass in vielen Klassendefinitionskörpern der letzte Ausdruck ein Methodendefinitionsausdruck ist, der zu "Null" auswertet. Manchmal ist es jedoch nützlich, wenn ein Klassendefinitionskörper einen bestimmten Wert, z. in der Klasse selbst; Selbstend-Idiom. –