Mit dem Beispielcode Sie gegeben haben, ist das Verhalten effektiv gleich. Es wird jedoch nicht immer dasselbe sein. Nehmen wir zum Beispiel den folgenden Code:
effective_module.rb
module Foo; end
require_sample.rb
require "./effective_module"
class Foo
end
Wenn Sie ruby require_sample.rb
ausgeführt werden Sie die folgende Fehlermeldung erhalten:
require_sample.rb:2:in `<main>': Foo is not a class (TypeError)
Dies zeigt uns, dass in Zeile 2, wenn class Foo
ist erreicht, Foo
wurde bereits als Modul definiert (von effective_module.rb
), und Ruby lässt Sie ein Modul nicht als Klasse neu definieren.
Jetzt nehmen wir die folgende Änderung vornehmen:
require_sample.rb
class Foo
require "./effective_module"
end
Wenn Sie jetzt ruby require_sample.rb
laufen, Sie einen anderen Fehler:
.../effective_module.rb:1:in `<top (required)>': Foo is not a module (TypeError)
Dieses Mal Foo
bereits definiert als class
wenn der require
erreicht ist. Mit Ruby können Sie ein Modul nicht als Klasse neu definieren.
Offensichtlich ist dies nicht die Art von Code, den Sie in der realen Welt schreiben würden, aber hoffentlich hilft es zu demonstrieren, dass, wo Sie Ihre s macht macht.
Ich dachte, Platzierung von require könnte auch Auswirkungen auf die Namensräume haben. I.e. Wenn ich eine Datei mit der Klasse "Foo" in der Klasse "Bar" benötige, müsste ich "Bar :: Foo.new" schreiben, um ein neues "Foo" -Objekt zu erstellen. Ich habe jedoch ein Experiment gemacht, und es stellt sich heraus, dass das nicht der Fall ist; Ich kann immer noch 'Foo.new' verwenden. Ich habe keine sehr präzise Frage, aber ich bin ein wenig verwirrt. Vielleicht kann jemand erklären, warum dies eine natürliche Wahl des Verhaltens für Rubin ist. – lwassink