トップ «前の日記(2006-07-30) 最新 次の日記(2006-08-01)» 編集

日々の破片

Subscribe with livedoor Reader
著作一覧

2006-07-31

_ Array#filter

こんなのが簡単に書けるメソッドはあるかな?

[1, 2, 3, 4, 5].inject([]) do |a, x}
  if x % 2 == 0
    a << x + 1
  end
  a
end

Enumerable#selectとは違って元の要素ではないものを入れる。Enumerable#collectとは違って不要な要素は削除する。

具体的にはこういう処理をしたい。

require 'pathname'
 
def child_dirs(dir)
  Pathname.new(dir).children.inject([]) do |a, x|
    if x.directory? && x.basename.to_s[0..0] != '.'
      a << x.basename.to_s
    end
    a
  end
end

これを

def child_dirs(dir)
  Pathname.new(dir).children.filter do |x|
    (x.directory? && x.basename.to_s[0..0]) ? x.basename.to_s : nil
  end
end

と書けるのがEnumerable#filter。でも、nilが要素として入れられないってのはまずいか……

module Enumerable
  def filter(&p)
    inject([]) do |a, x|
      n = p.call(x)
      if n
        a << n
      end
      a
    end
  end
end

_ 面倒くさそうだな

バックドアなどありません

おもしろおかしく再構成してるんだろうけど、ありそうではある。

本日のツッコミ(全3件) [ツッコミを入れる]
_ sawat (2006-07-31 10:42)

selectしてからcollectでよいのでは?<br>[1,2,3,4,5].select{|x| x % 2 == 0}.collect{|x| x+1}

_ arton (2006-07-31 10:56)

切れ目が欲しいな。

_ arton (2006-07-31 15:54)

↑携帯から書いたんで意味不明になっている。セレクト&コレクトしたいんじゃなくて、フィルタしたいという意味なので、本当は切れ目があってはならないんだけど、つい実装に気を取られたので逆に書き方になっている。なんていうか、2+2+2+2は、2*4とは違うということが言いたかっただけで、もちろん結果的にはその通りだと思います。


2003|06|07|08|09|10|11|12|
2004|01|02|03|04|05|06|07|08|09|10|11|12|
2005|01|02|03|04|05|06|07|08|09|10|11|12|
2006|01|02|03|04|05|06|07|08|09|10|11|12|
2007|01|02|03|04|05|06|07|08|09|10|11|12|
2008|01|02|03|04|05|06|07|08|09|10|11|12|
2009|01|02|03|04|05|06|07|08|09|10|11|12|
2010|01|02|03|04|05|06|07|08|09|10|11|12|
2011|01|02|03|04|05|06|07|08|09|10|11|12|
2012|01|02|03|04|05|06|07|08|09|10|11|12|
2013|01|02|03|04|05|06|07|08|09|10|11|12|
2014|01|02|03|04|05|06|07|08|09|10|11|12|
2015|01|02|03|04|05|06|07|08|09|10|11|12|
2016|01|02|03|04|05|06|07|08|09|10|11|12|
2017|01|02|03|04|05|06|07|08|09|10|11|12|
2018|01|02|03|04|05|06|07|08|09|10|11|12|
2019|01|

ジェズイットを見習え