2016-08-09 26 views
0

Gibt es einen Unterschied zwischen diesen beiden Beispiel Ruby-Programme? Es scheint dasselbe zu sein. require enthält nur das Ruby-Programm im Speicher.Require Anweisung Verwendung in Ruby

require_sample1.rb

class Klass 
    require "./effective_module" 
    include Mod 
end 

require_sample2.rb

require "./effective_module" 
class Klass 
    include Mod 
end 

effective_module.rb

module Mod 
end 

Antwort

0

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.

+0

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

Verwandte Themen