ich die Stripe-API zu lesen, und ich sehe dies:Stripe API öffnet die Metaklasse? Oder einfach eine Klassenmethode definieren?
module Stripe
...
class << self
attr_accessor :stripe_account, :api_key, :api_base, :verify_ssl_certs, :api_version, :connect_base, :uploads_base,
:open_timeout, :read_timeout
attr_reader :max_network_retry_delay, :initial_network_retry_delay
end
Was ist da los? Ich habe versucht, Yehuda Katz Blog zu lesen, aber Teile davon sind irgendwie unklar, wie folgt:
Was ist los in den zwei Beispielen, die er bietet?
Es stellt sich heraus, dass all diesen Zusammenbruch seltsamen Regeln nach unten in ein einziges Konzept: die Kontrolle über das Selbst in einem bestimmten Teil des Codes. Gehen wir zurück und werfen Sie einen Blick auf einige der Schnipsel wir früher aussah:
class Person
def name
"Matz"
end
self.name #=> "Person"
end
Hier haben wir den Namen Methode die Person-Klasse hinzufügen. Sobald wir
class Person
sagen, das Selbst bis zum Ende ist der Block diePerson
Klasse selbst.
Person.class_eval do
def name
"Matz"
end
self.name #=> "Person"
end
Hier machen wir genau die gleiche Sache: den Namen Methode, um Instanzen der
Person
Klasse hinzufügen. In dieser Fall, setztclass_eval
das Selbst zu Person bis Ende der Block. Das ist alles perfekt geradlinig, wenn sie mit Klassen zu tun, aber es ist ebenso geradlinig, wenn sie mit metaclasses Umgang:
Warum Yehuda halten Schreiben:
self.name #=> "Person"
Warum Yehuda rechts: 'self.name # =>" Person "' – Jwan622
@ Jwan622, weil es ein Kontext von 'Person' ist. Wie gesagt, es ist immer eine Frage des Selbst. Innerhalb des Klassenkörpers befinden Sie sich im Kontext dieser Klasse, was bedeutet, dass "selbst" auf die Klasse selbst verweist. Es ist das gleiche, als ob Sie 'Person.name' außerhalb der Klassendefinition schreiben würden. –
oh' name' ist eine eingebaute Funktion. – Jwan622