この複数行の複雑な条件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;
}
簡単な答えは、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
バックスラッシュ文字で空白をエスケープする必要がありますが、,いですが、条件を複数の行に分割する場合に必要です。それか、前の行にブール演算子を残してください。したがって、次のいずれかが機能します。
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