From: Shinya Kawaji Date: 2003-03-13T13:14:18+09:00 Subject: [ruby-list:37289] Re: 両方の式とも常に評価する論理和・論理積 かわじ、です。 > > きっと何か簡単な方法があるかと思うのですが、一般的に、二つの式を常に > > 両方とも評価して、その論理和や論理積を求める方法は他にありますでしょ > > うか? > >   C 言語や Java と同じく、 | を使います。 ありがとうございます。 おっと、こんな単純なものがあったのだな、と思いましたが、 この | は NilClass, FalseClass, TrueClass などに定義されているメソッド なので、今回の場合には String クラスにも定義する必要がありそうです。 >> class String >> def s_strip! >> gsub!(/\A\s+/,'') | gsub!(/\s+\z/,'') >> end >> end => nil >> "\n abc \t\r\n".s_strip! NameError: undefined method `|' for "abc":String from (irb):3:in `s_strip!' from (irb):6 >> class String >> def |(other) >> self >> end >> end => nil >> "\n abc \t\r\n".s_strip! => "abc" また、NilClass#| は、true or false を返しますので、(表題の「論理和・ 論理積」を求める、という意味においてはそれで十分に正しいのですが)、 今回のように nil を返したいということであれば、もう一工夫必要でした。 # nil の代わりに false が返ってきても、実際にはほぼ影響ないのですが。 >> "abc".s_strip! => false >> class String >> def s_strip! >> gsub!(/\A\s+/,'') | gsub!(/\s+\z/,'') || nil >> end >> end => nil >> "abc".s_strip! => nil String#| を定義しなくて済む方法を考えようと思ったのですが、 それには任意のオブジェクトを(条件式外のところで) true or false に 変換する機能が必要なように思いました。 そういう仕組みもまた、思い出せないのですが・・(でもきっとあるんだろうな) >> class Object >> def boolean >> self ? true : false >> end >> end => nil >> class String >> def s_strip! >> gsub!(/\A\s+/,'').boolean | gsub!(/\s+\z/,'').boolean ? self : nil >> end >> end => nil >> "\n abc \t\r\n".s_strip! => "abc" >> "abc".s_strip! => nil nil? を使うと以下のようにも(これは余計なものを何も定義しなくて済む)。 class String def s_strip! gsub!(/\A\s+/,'').nil? & gsub!(/\s+\z/,'').nil? ? nil : self end end しかし、String#| を使うのが、一番単純かもしれませんね。 ありがとうございました。 -- Shinya Kawaji