8

条件付きロジックを実行してから、条件の一部を返したいという状況がよくあります。真または偽の式で条件の一部を繰り返さずにこれを行うにはどうすればよいですか?

例えば:

ClassName.method.blank? ? false : ClassName.method

繰り返さないようにする方法はありますClassName.methodか?

実際の例を次に示します。

PROFESSIONAL_ROLES.key(self.professional_role).nil? ? 
    948460516 : PROFESSIONAL_ROLES.key(self.professional_role)
4

3 に答える 3

10

falseと同じように扱われて大丈夫だと仮定するとnil、次を使用します||

PROFESSIONAL_ROLES.key(self.professional_role) || 948460516

これは、またはを返す948460516場合は戻り、それ以外の場合は呼び出しの戻り値を返します。keynilfalsekey

これは、またはをkey返す場合にのみ948460516を返すことに注意してください。空の配列または文字列を返す場合は、そうではありません。2番目の例で使用したので、大丈夫だと思います。ただし、最初の例で使用した(そして空の配列と文字列を返す)ので、よくわかりません。nilfalsenil?blank?blank?true

于 2011-01-07T22:27:34.247 に答える
2

単に乾燥させたい場合は、一時変数を使用できます。

x = ClassName.method
x.blank? ? false : x

x = PROFESSIONAL_ROLES.key(self.professional_role)
x.nil? ? 948460516 : x

一時変数を使用したくない場合は、ブロックを使用できます。

Proc.new do |x| x.blank? ? false : x end.call(ClassName.method)
Proc.new do |x| x.nil? ? 948460516 : x end.call(PROFESSIONAL_ROLES.key(self.professional_role))

説明するケース(デフォルトチェックが失敗したときに元の値を使用したい場合)の場合、ヘルパーメソッドを作成するのは簡単です。

def x_or_default(x, defval, checker = :nil?)
  if x.send(checker) then defval else x end
end
x_or_default(ClassName.method, false, :blank?)
x_or_default(PROFESSIONAL_ROLES.key(self.professional_role), 94840516)

||これは説明した方法と非常に似ていますが、あなたのblank?例でも機能します。

私は通常、この種のものに一時変数を使用します。

于 2011-01-07T22:51:07.597 に答える
0

私はこれがあまりきれいに見えないことを知っています、しかしそれは物事を少し乾燥させます。

a = "ABC"
b = (temp = a.downcase).length < 3 ? "---" : temp

tempなんらかの理由で変数を作成したくない場合は、のような既存のものを再利用できます$_

于 2011-01-07T22:40:58.273 に答える