タイトルの通りである。unless A && Bはわかりにくい。
例えばRuby on Railsで開発している時。
array1 = ["text1", "text2"] array2 = []
という二つの配列があったとする。
puts "TEST1" unless array1.present? && array2.present? #1 puts "TEST2" unless array1.present? && array2.blank? #2 puts "TEST3" unless array1.blank? && array2.present? #3 puts "TEST4" unless array1.blank? && array2.blank? #4 puts "TEST5" unless array1.present? || array2.present? #5 puts "TEST6" unless array1.present? || array2.blank? #6 puts "TEST7" unless array1.blank? || array2.present? #7 puts "TEST8" unless array1.blank? || array2.blank? #8
この8つのうちどれがputsで文字列が表示されるのか?頭の中だけで考えてみると私は混乱する。
例えば#1だと、array1は存在するからarray1.present?はtrue でarray2は存在しないからarray2.present?はfalse。true && falseなのでtrue。そのunlessなのでこれは表示されない??
いや違う。これは表示される。
pry(main)> puts "TEST1" unless array1.present? && array2.present? TEST1
これはわかりにくい・・・。unless A && Bは非常にわかりにくいのだ!(私には)
そこでunlessをifで書き換える。
puts "TEST1" if array1.blank? || array2.blank? #1 puts "TEST2" if array1.blank? || array2.present? #2 puts "TEST3" if array1.present? || array2.blank? #3 puts "TEST4" if array1.present? || array2.present? #4 puts "TEST5" if array1.blank? && array2.blank? #5 puts "TEST6" if array1.blank? && array2.present? #6 puts "TEST7" if array1.present? && array2.blank? #7 puts "TEST8" if array1.present? && array2.present? #8
そうすると#1はarray1はblank?そうじゃないね。じゃあarray?はblank?そうだね。TEST1が表示されるね。
とわかる。個人的にはこちらの方がわかりやすい。
unless A && B
は
if !A || !B
にしたほうがわかりやすいと思う。
これは高校の数学Aで習うド・モルガンの法則というやつだ。