2017-02-23 12 views
0

は、私は次のようにレポートのクラスが定義されている次のようモジュールにデータを設定して、Rubyのモジュールメソッドでデータを再利用する方法はありますか?

class Report 

include Parser 

def initialize(file: file) 
    @file = remove_bookmarks(file: parse(file)) 
    @proofread_text = original(file: @file) 
    @original_text = proofread(file: @file) 
    @paragraphs = paragraphs(file: @file) 
end 


end 

パーサモジュールは、次のとおりです。

module Parser 

    def parse(file:file) 
     zip_file = Zip::File.open(file) 
    end 

    def remove_bookmarks(file: file) 
     file.at("//w:bookmarkStart").remove if file.at("//w:bookmarkStart") 
     file.at("//w:bookmarkEnd").remove if file.at("//w:bookmarkEnd") 
    end 

    def proofread(file: file) 
     text(@file, filter: 'del') 
    end 

    def original(file: file) 
     text(@file) 
    end 

    def paragraphs(file: file) 
    file.xpath('//w:p[w:ins or w:del]') 
    end 

    def text(file: file, filter: 'ins') 
     xpath("//text()[not(ancestor::w:#{filter})]").map(&:text).join("") 
    end 

end 

私は私のinitializeメソッドは、パーサモジュール内の別のメソッドに同じファイルを渡すことに気づきました。

ファイルのデータをモジュール内で使用できるように設定する方法はありますか?毎回ファイルオブジェクトを渡す必要はありませんか?

答えて

1

はい、Parserモジュールのメソッドで@fileインスタンス変数を使用できます。モジュールをクラスに含めると、モジュールのメソッドがクラスのインスタンスメソッドとして機能します。

@fileは以下のように使用できます。あなたが気をつけに持って

class Report 

include Parser 

    def initialize(file: file) 
    @file = remove_bookmarks(file: parse(file)) 
    @proofread_text = original 
    @original_text = proofread 
    @paragraphs = paragraphs 
    end 
end 

module Parser 
    def parse(file:file) 
    zip_file = Zip::File.open(file) 
    end 

    def remove_bookmarks(file: file) 
    file.at("//w:bookmarkStart").remove if file.at("//w:bookmarkStart") 
    file.at("//w:bookmarkEnd").remove if file.at("//w:bookmarkEnd") 
    end 

    def proofread 
    text(@file, filter: 'del') 
    end 

    def original 
    text(@file) 
    end 

    def paragraphs 
    @file.xpath('//w:p[w:ins or w:del]') 
    end 

    def text(file: file, filter: 'ins') 
    xpath("//text()[not(ancestor::w:#{filter})]").map(&:text).join("") 
    end 
end 

だけの事はParserモジュールが他のクラスに含まれている場合は、パーサモジュールのいずれかの方法を使用する前に、@file変数を作成する必要があります。

1

Reportクラスにattr_reader :fileを定義すると、Parserモジュールからファイルを呼び出すことができます。しかし、引数の命名には注意が必要です。私はzip_fileを使用することをお勧めします。

class Report 
    include Parser 

    attr_reader :file 

    def initialize(zip_file) 
    @file = remove_bookmarks(zip_file) 
    @proofread_text = original 
    @original_text = proofread 
    @paragraphs = paragraphs 
    end 
end 

module Parser 
    def remove_bookmarks(zip_file) 
    parse(zip_file) 
    zip_file.tap do |z| 
     z.at("//w:bookmarkStart").remove if file.at("//w:bookmarkStart") 
     z.at("//w:bookmarkEnd").remove if file.at("//w:bookmarkEnd") 
    end 
    end 

    def proofread 
    text('del') 
    end 

    def original 
    text 
    end 

    def paragraphs 
    file.xpath('//w:p[w:ins or w:del]') 
    end 

    private 

    def text(filter = 'ins') 
    file.xpath("//text()[not(ancestor::w:#{filter})]").map(&:text).join("") 
    end 

    def parse(zip_file) 
    Zip::File.open(zip_file) 
    end 

end 
1

インスタンス変数を使用することができます。あなたはすでにいくつかの場所でそれをやったことがあります。あなたがルビーの最新バージョンを使用している場合のために、あなたにマークをありがとうあなたはおそらくも単純 file.at("//w:bookmarkStart")&.remove

+0

file.at("//w:bookmarkStart").remove if file.at("//w:bookmarkStart") を変更することができます

module Parser attr_reader :file def parse(file:file) @file = Zip::File.open(file) end def remove_bookmarks file.at("//w:bookmarkStart").remove if file.at("//w:bookmarkStart") file.at("//w:bookmarkEnd").remove if file.at("//w:bookmarkEnd") end ... end 

class Report include Parser def initialize(file: file) parse_file remove_bookmarks @proofread_text = original @original_text = proofread @paragraphs = paragraphs end end module Parser def parse(file:file) @file = Zip::File.open(file) end def remove_bookmarks @file.at("//w:bookmarkStart").remove if @file.at("//w:bookmarkStart") @file.at("//w:bookmarkEnd").remove if @file.at("//w:bookmarkEnd") end ... end 

また、のような何かを行うことができますfile.at( "// w:bookmarkStart")&。あなたの答えを削除してください。 Rubyバージョン2.2.3を使用しています。私はコードを試してみたときに "予期しない"というエラーが出ました。 "私はRubyバージョン2.4が必要ですか? – chell

+0

これはRuby 2.3で導入されました。セーフナビゲーションオペレータと呼ばれています。パフォーマンスが問題であれば、私は 'at'関数の戻り値を保存することを検討します(遅く見えます)。 –

+0

ありがとうMarc。私はat関数の戻り値を保存し、新しい考え方を利用するためにRuby 2.3に挑戦します。 – chell

関連する問題