2011-09-10 8 views
0

文字列の存在を評価するためのコードを書いていますが、1つしか存在しないようにしたいと思います。それらは相互に排他的です。文字列のより良い論理XOR解を探しています

.present?を繰り返し使用する必要はありませんか?猿パッチオペレータを定義する文字列^?私はちょうどブーリアンへの明示的なキャストが基本的に何かを必要とするのが不自然であると感じるので、if aを行うことに慣れています。私はこのユースケースがRubyで「うまくいく」ように感じます。

答えて

2

Enumerableは実際にはあなたが必要とするものを正確に行うone?メソッドを定義しています。

# So either... 

[a, b, c].one?(&:present?) 

# or 

[a, b, c].one?(&:presence) 

# ... would do the trick in this case. 

残念ながらあなたはtwo?やetceraをしたい場合、あなたは運の出ています。

2

あなたはcountでこのような何かを行うことができます:

errors.add(:base 'specify exactly 1') unless [a, b, c].count(&:present?) == 1 

あなたは、多くても1つの代わりに、正確に一つにしたい場合:たとえば

errors.add(:base 'specify at most 1') unless [a, b, c].count(&:present?) > 1 

> ['',nil,'6',''].count(&:present?) 
=> 1 
> ['',nil,'6',11].count(&:present?) 
=> 2 
> ['',nil,''].count(&:present?) 
=> 0 
1

あなたは正確に一つの方法abの、およびcリターンnull以外の値かどうかを確認したい場合は、あなたが使用することができます。

[a, b, c].compact.count == 1 

たり、数字のおかげで、

[a, b, c].one? 
+0

この質問に明示的には記載されていませんが、空の文字列がnull(偽)であるかのように動作するように空の文字列を探しているということです。 – numbers1311407

+0

私は実際に文字列で使用する論理XOR演算子を探しています。私は、クライアントがそれを設定した(またはしようとした)ことを意味しているので、 '' ''を真とみなしても結構です。 '' a''を '' ''に ''を ''入れ替えるために私が知っている他の唯一の方法は警告です。 –

+0

文字列はRubyでは真実であり、ブール値に変換する必要はありません。偽の唯一の値はnullです(ユーザーが属性を設定していない場合はおそらくあります)。 –

関連する問題