Entries

スポンサーサイト

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。
この記事に対してトラックバックを送信する(FC2ブログユーザー)
http://kovayashi.blog120.fc2.com/tb.php/67-9019150e

-件のトラックバック

-件のコメント

コメントの投稿

投稿フォーム
投稿した内容は管理者にだけ閲覧出来ます

rubyのクロージャproc

rubyでZipファイルを取り扱うのに便利なziprubyは、
ファイルからZipファイルを読み込む時と、
通信などでメモリバッファに取り込んだZip形式データとで、
呼び出すメソッドが異なる。

・Zip::Archive.open(ファイル名)
・Zip::Archive.open_buffer(バッファ名)

これを一つのメソッドにして、与える引数によって、ファイルでもバッファでもおkにしてみる。
#Zipの中にZipがあるようなデータをアーカイブしたい場合には、このようなメソッドが欲しくなるはず。

まずは、そのメソッド(zipと呼称する)の呼び出し方から


file='hoge.zip'
zip(:file=>file) do |f|
puts f.name
end

f=open(file,'rb')
buf=f.read
f.close

zip(:buf=>buf) do |f|
puts f.name
end


で、とりあえずそのzipメソッドを書いてみる。

#Case 1
require 'rubygems'
require 'zipruby'

def zip(arg)
if arg[:file] then
Zip::Archive.open(arg[:file]) do |ar|
ar.num_files.times do |i|
ar.fopen(i) do |f|
yield(f)
end
end
end
else
Zip::Archive.open_buffer(arg[:buf]) do |ar|
ar.num_files.times do |i|
ar.fopen(i) do |f|
yield(f)
end
end
end
end
end


恐ろしく冗長である。
そこで、共通部分となるブロックをprocを使って外出しにする。


#Case 2
def zip(arg)
block = proc{ |ar|
ar.num_files.times do |i|
ar.fopen(i) do |f|
yield(f)
end
end
}
if arg[:file] then
Zip::Archive.open(arg[:file],&block)
else
Zip::Archive.open_buffer(arg[:buf],&block)
end
end


さらに__send__を使ってみる。


#Case 3
def zip(arg)
Zip::Archive.__send__(arg[:file] ? 'open': 'open_buffer',
arg[:file] ? arg[:file] : arg[:buf], &proc { |ar|
ar.num_files.times do |i|
ar.fopen(i) do |f|
yield(f)
end
end
} )
end


ステップ数をプログラムの指標としている人達には、
rubyは不都合である事がお解かりになっただろう。

この記事に対してトラックバックを送信する(FC2ブログユーザー)
http://kovayashi.blog120.fc2.com/tb.php/67-9019150e

0件のトラックバック

0件のコメント

コメントの投稿

投稿フォーム
投稿した内容は管理者にだけ閲覧出来ます

Appendix

プロフィール

kovayashi

Author:kovayashi
・嫌いなもの
 →好きなもの

・インストール
 →バンドル
・バックアップ
 →アップロード
・努力
 →チート

最近のトラックバック

ブログ内検索

上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。