include?を考える
Havel, Hakimiの定理をRubyでしたとき,渡された配列の中に負の数があるとfalseが返るように
return false if list.select{|e| e < 0}.size > 0
という処理を組み込んだのだけども,これ単純に「負の数が含まれてたらtrueを返す」みたいな,それこそselectのようにブロックを渡すみたいなノリのことを,include?で出来ないのかなとリファレンスを見るも,そんな挙動はしないようで少しガッカリ.
ちょっと説明が難しいので簡単にコードで表すと,
arr = [-2,-1,0,1,2] p arr.include?{|e| e < 0} => true
こんな感じの処理がしたいと思ったのですよ.で,考えてみたのはこんな感じ.イテレータでぐるぐる.
class Array def include_with_block each do |e| return true if yield(e) end return false end end
実行して見ると,まぁ要求通りの挙動.
list = [1,2,3] p list.include_with_block{|e| e < 0} => false list = [1,-3,0] p list.include_with_block{|e| e < 0} => true
折角だから,中でselectを呼びたいな.
class Array def include_with_block select{|e| yield(e)}.size > 0 end end
満足.結果は割愛.ただinclude_with_blockという名前が何とも間抜け.自分のネーミングセンスの無さに脱帽.