Je mehr idiomatische Weg, dies in Ruby zu erreichen ist:
module B
def self.included(klass)
klass.class_eval <<-ruby_eval
CONST = find
ruby_eval
# note that the block form of class_eval won't work
# because you can't assign a constant inside a method
end
end
class A
def self.find
"AAA"
end
include B
end
puts A::CONST
Was Sie taten (Klasse < < Basis) Sie tatsächlich metaclass
der setzt in den Kontext von A, nicht A selbst. Die find
Methode ist auf A selbst, nicht seine Metaklasse. Zu beachten ist, dass Klassen selbst Objekte sind und somit eigene Metaklassen haben.
Um zu versuchen, es deutlicher zu machen:
class Human
def parent
# this method is on the Human class and available
# to all instances of Human.
end
class << self
def build
# this method is on the Human metaclass, and
# available to its instance, Human itself.
end
# the "self" here is Human's metaclass, so build
# cannot be called.
end
def self.build
# exactly the same as the above
end
build # the "self" here is Human itself, so build can
# be called
end
Nicht sicher, ob das hilft, aber wenn Sie es nicht verstehen, können Sie immer noch das class_eval Idiom oben verwenden.
Ja, ich erreiche diese Lösung auch. Aber dieser Meta-Aufruf ist keine sehr gute Idee. Gibt es mehr geraden Weg? –
Sie versuchen, zur Laufzeit einen konstanten Wert dynamisch zuzuweisen. AFAIK, andere Wege werden eine "dynamische Konstante Zuweisung" Fehler auslösen. –