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