3つのファイルから比較表を作成


404 Blog Not Found:ruby - 添削 - もっとDRYに と、Matzにっき- ユメのチカラ: Rubyで習作 添削 経由で。キミならどう書く?的なノリでトライしてみました。例によって、SqueakSmalltalk で書いてから、あとで Ruby の直訳っぽいのを載せます。


まず SqueakSmalltalk で。

| inNames outName distributions outFile |

inNames := #('Asianux_pkg_list.txt' 'dist_A_list.txt' 'dist_B_list.txt').
outName := 'out.txt'.

distributions := inNames collect: [:fname |
   | distribution file |
   distribution := OrderedCollection new.
   file := FileStream oldFileNamed: fname.
   [[file atEnd] whileFalse: [distribution add: file nextLine]]
      ensure: [file ifNotNil: [file close]].
   distribution].

outFile := FileStream newFileNamed: outName.
distributions first do: [:pkg |
   outFile nextPutAll: pkg.
   distributions allButFirstDo: [:distn |
      outFile nextPut: $,.
      outFile nextPutAll: ((distn includes: pkg)
         ifTrue: ['include']
         ifFalse: ['not-include'])].
   outFile cr].

outFile edit


これを Ruby コードに変換。

class Array
  def first; self[0] end
  def all_but_first; self[1..-1] end
end

distns = ARGV.collect do |fname|
  distn = []
  File.open(fname) { |f| f.each { |li| distn << li.chomp }}
  distn
end

distns.first.each do |pkg|
  print pkg
  distns.all_but_first.each do |distn|
    print ","
    print distn.include?(pkg) ? "include" : "not-include"
  end
  print "\n"
end


あ。エラー処理してないけど、ま、いっか。


あと、Ruby には Squeak Smalltalk の #allButFirstDo: がないので、じゃっかん富豪的です(^_^;)。←つか、書けよ…。w


ということで(効率上の意味はほぼ無に等しいのですが、Ruby の勉強のため…)、めんどくさがらずに書きました。→ #all_but_first_each

class Array
  def first; self[0] end
  def all_but_first_each; (1..size-1).each { |i| yield self[i] } end
end

distns = ARGV.collect do |fname|
  distn = []
  File.open(fname) { |f| f.each { |li| distn << li.chomp }}
  distn
end

distns.first.each do |pkg|
  print pkg
  distns.all_but_first_each do |distn|
    print ","
    print distn.include?(pkg) ? "include" : "not-include"
  end
  print "\n"
end