2016-08-26 4 views
1

Ich skizziere, wie würde CsvVerify-Modul arbeiten. Gibt es eine Möglichkeit nicht Klasse verschmutzen, die das Modul mit InstanzvariablenWie vermeidet man die Verwendung von Instanzvariablen in Modulen?

Idee von virtus inspiriert umfassen wird und geht in etwa so:

employee_csv_importer.rb (mit dem Modul)

class EmployeeCsvImporter 
    include CsvVerify 

    headers 'ID', 'First Name', 'Last Name', 'Title or Department', 
    'Age', 'Native Language', 'Fluent in English?' 
end 

csv_verify.rb

module CsvVerify 
    puts "included" 

    def headers(*names) 
    @config = Config.new 
    end 
end 

config.rb

module CsvVerify 
    class Config 

    end 
end 

Also wie reorganisiere ich dies, um die Verschmutzung von EmployeeCsvImporter mit @config zu vermeiden?

PS. Und warum funktioniert das nicht jetzt?
Warum bekomme ich diese Ausgabe von running employee_csv_importer.rb?

included 
/data/gems/csv_verify/examples/1_employees.rb:6:in `<class:EmployeeCsvImporter>': 
undefined method `headers' for EmployeeCsvImporter:Class (NoMethodError) 

Antwort

1

Ich würde vorschlagen, dass Sie Ihre Funktionalität zunächst ohne module und include das Schreiben beginnen. Dies hilft, die Struktur zu gestalten, besonders wenn Sie Ruby neu sind.

Die hinzugefügten Methoden, einschließlich CsvVerify, werden als Instanzmethoden und nicht als Klassenmethoden hinzugefügt. Daher haben Sie diese NoMethodError.

+0

def self.headers funktioniert auch nicht. Also empfehlen Sie, dass ich CsvVerify stattdessen eine Klasse mache und EmployeeCsvImporter erben lasse? Auch bin ich nicht neu in Ruby, sondern schreibe Module. Nie ein ähnliches Konzept in anderen Sprachen gefunden und muss es eines Tages meistern. –

+0

müssen Sie Ihre Klasse mit dem Modul, das die '' 'header''' Methode bereitstellt, erweitern. Ich schlage vor, Sie zuerst schreiben die volle Funktionalität Ihrer Klasse und dann entscheiden, wie und wenn Sie wollen/müssen in Module aufgeteilt werden. . –

+0

ok extend funktioniert, danke, aber das bedeutet @config wird eine Klassenvariable sein? –

Verwandte Themen