Project

General

Profile

Feature #7767

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

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

Added by kyanagi (Kouhei Yanagita) about 5 years ago. Updated about 5 years ago.

Status:
Closed
Priority:
Normal
Target version:
[ruby-dev:46902]

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_at_block_end, *args, &block)
    tempfile = new(*args)

    if block_given?
    begin
    yield(tempfile)
    ensure

  •      tempfile.close
    
  •      tempfile.close(unlink_at_block_end)
     end
    

    else
    tempfile

    Index: test/test_tempfile.rb

    --- test/test_tempfile.rb (revision 39003)
    +++ test/test_tempfile.rb (working copy)
    @@ -304,5 +304,13 @@
    assert_equal(0600, t.stat.mode & 0777)
    end
    end
    +

  • def test_open_bang_with_block

  • path = nil

  • Tempfile.open!('foo') do |f|

  •  path = f.path
    
  • end

  • assert !File.exist?(path)

  • end
    end

History

#1 [ruby-dev:46903] Updated by akr (Akira Tanaka) about 5 years 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 [ruby-dev:46979] Updated by yhara (Yutaka HARA) about 5 years ago

  • Category set to lib
  • Target version set to 2.6

#3 [ruby-dev:47065] Updated by ko1 (Koichi Sasada) about 5 years ago

  • Assignee set to akr (Akira Tanaka)

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

#4 [ruby-dev:47219] Updated by akr (Akira Tanaka) about 5 years ago

  • Parent task set to #5707

#5 [ruby-dev:47220] Updated by shugo (Shugo Maeda) about 5 years ago

akr (Akira Tanaka) wrote:

メソッド名ですが、

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

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

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

#6 [ruby-dev:47224] Updated by akr (Akira Tanaka) about 5 years ago

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

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

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

#7 [ruby-dev:47279] Updated by akr (Akira Tanaka) about 5 years ago

  • Status changed from Open to Closed

Also available in: Atom PDF