2017-03-01 4 views
0

私は非常に似ています次の二つの方法があります:1つの方法まで二つの方法から、このコードをリファクタリングする方法

  def space_before_element?(start_element) 
       element = start_element.previous_element 
       until element.nil? || 
       (element.name == start_element.name || "r" && !element.text.empty?) 
        element = element.previous_element 
       end 
       character = element 
          .text 
          .split(/(\W)/) 
          .compact 
          .reject(&:empty?) 
          .last 
          .last_character \ 
          unless element.nil? 

       element.nil? || 
       (character.punctuation? && !character.hyphen? && !character.apostrophe?) || 
       character.spaces? 
       end 


      def space_after_element?(start_element) 
       element = start_element.next_element 
       until element.nil? || 
       (element.name == start_element.name || "r" && !element.text.empty?) 
        element = element.next_element 
       end 
       character = element 
          .text 
          .split(/(\W)/) 
          .compact 
          .reject(&:empty?) 
          .last 
          .first_character \ 
          unless element.nil? 

       element.nil? || 
       (character.punctuation? && !character.hyphen? && !character.apostrophe?) || 
       character.spaces? 
       end 

私は許す必要な変更を行う方法を見つけ出すように見えることはできませんが私はこれを1つの方法に減らしました。

はまだ行く私のRubyのスキルを取得します。

助けてください。 ルビー2.2.3

+0

すべての '' **さんとは何ですか?有効なRubyコードのみを含めるべきです。 (私はそれがdownvoteの理由だと思っています。)また、コードを読むために横にスクロールしなければならないときには、自分自身も含めて、いくつかの読者が困惑しています。どのようにラインを壊す必要はありませんか? –

+0

ここで提供されているツールを使用して異なる方法でアイテムを太字にして、違いをより簡単に表示できるようにしました。私はあなたの助言に従い、それを必要としないように分割します。謝罪。 – chell

+0

これらのメソッドはどのクラスに定義されていますか? –

答えて

4

私は3つの相違点を数えます。だから、これらの違いを明示的に宣言する必要があります。

METHODS = { 
    prev: [:previous_element, %i|last last_character|], 
    next: [:next_element, %i|first first_character|] 
}.freeze 

今、私たちはメソッドにパラメータを渡す:

def space_around_element?(start_element, prev_or_next = :prev) 
    element = start_element.public_send(METHODS[prev_or_next].first) 
    # same code 
    character = element 
       .text 
       .split(/(\W)/) 
       .reject(&:empty?) 
       .public_send(METHODS[prev_or_next].last.first) 
       .public_send(METHODS[prev_or_next].last.last) \ 
     unless element.nil? 
    # same code 
    end 
+0

このお返事をいただきありがとうございます。 – chell

+0

あなたはようこそ。 – mudasobwa

関連する問題