プロが教えるわが家の防犯対策術!

hairetu = [1,2,3,4,5]

という配列があった時
3と4が含まれているかを判断するには

if hairetu.include?(3) && hairetu.include?(4)
 p "3と4が含まれている"
end

と書けばよいのですが
条件が増えたら、見にくくなってしまいます。
そういった理由で

if hairetu.include?(3,4)

if hairetu.include?(3 or 4)
という具合に、短く書く方法があれば
ご教授お願い致します。

A 回答 (5件)

この場合はArray#-が単純で良いと思います。


([3, 4] - hairetu).empty?
    • good
    • 1
この回答へのお礼

MillenniuM 様

回答ありがとうございます。

とてもシンプルで、分かりやすいので
これを利用させて頂こうと思います。

配列の引き算が出来るのは初めて知りました。
引き算を利用した、素晴らしい発想だと思いました。

お忙しい中、ありがとうございました。

お礼日時:2011/09/30 20:23

# ANo4さんへ



おぉなるほど、集合演算でも「-」を使うと今回のケースが綺麗に解決できるんですね・・・思いつきませんでした。
合致判定を Array#include? に依らないのであれば、これがスマートだと思います。

Array#include? は「==」に依存しますが、Array#-は「eql?」に依存する為、動きが異なります。
組み込みクラスでわかりやすいのはFloatが混じった時でしょうか。
http://codepad.org/fqyFSGRK
    • good
    • 0
この回答へのお礼

sholmes様

補足説明ありがとうございます。
小数点がある場合は、注意が必要なのですね。

大変参考になりました。
お忙しい中、ありがとうございました。

お礼日時:2011/09/30 20:30

重複をどう扱いたいかわからんけど、何も考えない策としては




sub = [1, 1, 3]

sup = [4, 3, 1, 2, 1]

sup.permutation(sub.size).include?(sub)

とか。
    • good
    • 0
この回答へのお礼

koko_u_u様

回答ありがとうございます。

大変参考になりました。
お忙しい中、ありがとうございました。

お礼日時:2011/09/30 20:22

そのまま実現している組み込みメソッドは、ちょっと思い当たりませんでした。


自分なら多分、 Enumerable#all? を使ってこんな感じの対処をするかなとは思います。

https://ideone.com/o1plX

<おまけ>
ANo.1さんへ

集合演算とempty?やany?だけだと、こんな感じの時に困りませんか?

# OK
p [3, 4] & [1, 2, 3, 4, 5]
p [3, 4] & [1, 2, 5]

# NG
p [3, 4] & [1, 2, 3, 5]

最後に要素数のチェックを入れた方が良いかもしれません。
    • good
    • 0
この回答へのお礼

sholmes様

回答ありがとうございます。

見た目的にシンプルになりますが
回答NO.4の配列の引き算を利用した方が
分かりやすい気がしましたので
そちらを使わせて頂こうと思います。

しかしながら、この方法も
準備さえしておけば、便利使えると思いますので
何かに応用させて頂こうと思います。

ありがとうございました。

お礼日時:2011/09/30 20:22

ご教示…



@ary1 & @ary2 で共通要素が取り出されます。
unless (@ary1 & @ary2).empty?
などのようにしてみてはいかがでしょうか。
unlessが嫌なら
if (@ary1 & @ary2).size > 0
    • good
    • 0
この回答へのお礼

Ma-yan_bh1011様

回答ありがとうございます。

大変参考になりました。
お忙しい中、ありがとうございました。

お礼日時:2011/09/30 20:22

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!