web-dev-qa-db-ja.com

Rubyで複雑な複数行のif条件を書くにはどうすればよいですか?

この複数行の複雑な条件ifステートメントをRubyで書くにはどうすればよいですか?

  if ( (aa != nil && self.prop1 == aa.decrypt)   
      || (bb != nil && self.prop2 == bb.decrypt)  
    ) && (self.id.nil? || self.id != id) 
    return true
  end

Syntax error; unexpected tOROP

Javaでは、私は書くことができます

if (
     ( (aa != null && aa.prop1.equals(aa.decrypt()))
     || (bb != null && bb.prop2.equals(bb.decrypt()))
     )
     && (this.id != id)
   ) {

   return true;
}
46
Chloe

簡単な答えは、Rubyにステートメントの一部として次の行を読み続けるためにオペレーターが行の最後にいる必要があるため、これは機能します:

if ( (aa != nil && self.prop1 == aa.decrypt) ||
   (bb != nil && self.prop2 == bb.decrypt) ) &&
   (self.id.nil? || self.id != id)
  return true
end

そうは言っても、おそらく入力値に基づいて例外をスローし、いくつかの冗長なチェックを削除することでロジックを減らすことができます(変数がどのように見えるかについてここでジャンプしますが、アイデアは得られます)。

raise 'aa must support decrypt' unless aa.respond_to? :decrypt
raise 'bb must support decrypt' unless bb.respond_to? :decrypt
if prop1 == aa.decrypt || prop2 == bb.decrypt
  if self.id != id
    return true
  end
end
76
Kyle Smith

バックスラッシュ文字で空白をエスケープする必要がありますが、,いですが、条件を複数の行に分割する場合に必要です。それか、前の行にブール演算子を残してください。したがって、次のいずれかが機能します。

if ( (aa != nil && self.prop1 == aa.decrypt)\
      || (bb != nil && self.prop2 == bb.decrypt)\
    ) && (self.id.nil? || self.id != id) 
    return true
  end

または:

if ( (aa != nil && self.prop1 == aa.decrypt) || 
      (bb != nil && self.prop2 == bb.decrypt)) &&
    (self.id.nil? || self.id != id) 
    return true
  end

私は通常、決定されていることを自己文書化するメソッドに各条件またはすべての条件を入れることを決定します。

def everythings_cool?
  ( (aa != nil && self.prop1 == aa.decrypt) || 
          (bb != nil && self.prop2 == bb.decrypt)) &&
        (self.id.nil? || self.id != id) 
end

その後:

if everythings_cool?
  # do stuff
18
DiegoSalazar