Feature #7767

Feature #5707: temporary file creation without finalizer and delegate.

Tempfileで自動的にファイルを削除する

Added by Kouhei Yanagita about 1 year ago. Updated 12 months ago.

[ruby-dev:46902]
Status:Closed
Priority:Normal
Assignee:Akira Tanaka
Category:lib
Target version:next minor

Description

ソースコードのコメント(tempfile.rbのGood practicesの項)にも書かれている通り、
Tempfileは使用後、明示的に削除することが推奨されています。

しかし、Tempfile.openにブロックを渡すと自動的にcloseするところまではやってくれるのに、
削除をわざわざ明示的に書かないといけないというのは少し残念な気もします。

Tempfile.openの類推で、ブロックを抜けると自動的にclose!してくれるメソッドがあると、
削除に気を使わなくてもよくなり、使いやすいのではないかと思いましたがいかがでしょうか。

メソッド名ですが、
* 使いやすさを考えると、openと同じくらいに書きやすい(短い)ものがよい
* Tempfile.openはブロックを抜けるときにcloseするが、提案する新メソッドではclose!する
という点を考えて、ひとまずTempfile.open!を提案してみます。

Index: lib/tempfile.rb

--- lib/tempfile.rb (revision 39003)
+++ lib/tempfile.rb (working copy)
@@ -305,6 +305,9 @@
#
# In any case, all arguments (+args+) will be passed to Tempfile.new.
#
+ # +open!+ is same as +open+, except that the file will be deleted immediately
+ # after the block terminates.
+ #
# Tempfile.open('foo', '/home/temp') do |f|
# ... do something with f ...
# end
@@ -316,14 +319,23 @@
# ensure
# f.close
# end
- def open(
args)
+ def open(args, &block)
+ _open(false, *args, &block)
+ end
+
+ def open!(
args, &block)
+ open(true, *args, &block)
+ end
+
+ private
+ def _open(unlink
atblockend, args, &block)
tempfile = new(
args)

   if block_given?
     begin
       yield(tempfile)
     ensure
  • tempfile.close
  • tempfile.close(unlinkatblockend) end else tempfile Index: test/testtempfile.rb =================================================================== --- test/testtempfile.rb (revision 39003) +++ test/testtempfile.rb (working copy) @@ -304,5 +304,13 @@ assert_equal(0600, t.stat.mode & 0777) end end +
  • def testopenbangwithblock
  • path = nil
  • Tempfile.open!('foo') do |f|
  • path = f.path
  • end
  • assert !File.exist?(path)
  • end end

History

#1 Updated by Akira Tanaka about 1 year ago

2013/2/1 kyanagi (Kouhei Yanagita) redmine@ruby-lang.org:

しかし、Tempfile.openにブロックを渡すと自動的にcloseするところまではやってくれるのに、
削除をわざわざ明示的に書かないといけないというのは少し残念な気もします。

Tempfile.openの類推で、ブロックを抜けると自動的にclose!してくれるメソッドがあると、
削除に気を使わなくてもよくなり、使いやすいのではないかと思いましたがいかがでしょうか。

よいと思うのですが、ブロックを抜けるときに消すなら、GC で消す必要はないのではないでしょうか。
Tempfile のインスタンスである必要もないですよね、
ということで、http://bugs.ruby-lang.org/issues/5707 を提案したんですが、
名前が問題で止まっています。

メソッド名ですが、
* 使いやすさを考えると、openと同じくらいに書きやすい(短い)ものがよい
* Tempfile.openはブロックを抜けるときにcloseするが、提案する新メソッドではclose!する
という点を考えて、ひとまずTempfile.open!を提案してみます。

名前が通るといいですねぇ。
--
[田中 哲][たなか あきら][Tanaka Akira]

#2 Updated by Yutaka HARA about 1 year ago

  • Category set to lib
  • Target version set to next minor

#3 Updated by Koichi Sasada about 1 year ago

  • Assignee set to Akira Tanaka

誰にアサインすればわからなかったのですが、
詳しそうな田中さんにアサインさせて頂きます。

#4 Updated by Akira Tanaka about 1 year ago

  • Parent task set to #5707

#5 Updated by Shugo Maeda about 1 year ago

akr (Akira Tanaka) wrote:

メソッド名ですが、
* 使いやすさを考えると、openと同じくらいに書きやすい(短い)ものがよい
* Tempfile.openはブロックを抜けるときにcloseするが、提案する新メソッドではclose!する
という点を考えて、ひとまずTempfile.open!を提案してみます。

名前が通るといいですねぇ。

Tempfile.openとTempfile.open!で違うクラスのインスタンスが作成されるのは
ちょっとわかりにくいような気がしますので、openから派生した名前でない方がよいの
ではないでしょうか。
例えば、Tempfile.createはどうでしょう。

#6 Updated by Akira Tanaka about 1 year ago

2013年4月4日 18:34 shugo (Shugo Maeda) redmine@ruby-lang.org:

Tempfile.openとTempfile.open!で違うクラスのインスタンスが作成されるのは
ちょっとわかりにくいような気がしますので、openから派生した名前でない方がよいの
ではないでしょうか。
例えば、Tempfile.createはどうでしょう。

いいような気がします。そうしますか。
--
[田中 哲][たなか あきら][Tanaka Akira]

#7 Updated by Akira Tanaka 12 months ago

  • Status changed from Open to Closed

Also available in: Atom PDF