[ruby-list:50904] Re: 一時的にグローバル変数を差し替える

From: Hidetoshi NAGAI <nagai@...>
Date: 2020-09-29 14:29:03 UTC
List: ruby-list #50904
永井@知能.九工大です.

たまたま目に入り,そう難しくない話のようなのに
誰も答えていなかったので取り敢えず.

multi-thread のことを考えると,このようなグローバル変数操作は
あまり勧められることではないように思いはしますが,こんな感じでしょうか.
===========================================================================
#! /usr/bin/ruby

class File
  def self.temp_sout(path)
    sout = $stdout
    begin
      fp = open(path, "w")
      $stdout = fp
      yield
    ensure
      $stdout = sout
      fp.close unless fp.closed?
    end
  end
end

#------------------------------------------------------------
if __FILE__ == $0

  th = Thread.new{
    15.times{|n|
      puts "thread: #{n} #{$stdout}"
      sleep 1
    }
  }
  
  sleep 5
  
  puts "main: prev #{$stdout}"
  
  File.temp_sout("/tmp/temporal_stdout_test.log"){
    5.times{|n|
      puts "temp: #{n} #{$stdout}"
      sleep 1
    }
  }
  
  puts "main: post #{$stdout}"
  
  th.join

end
===========================================================================
勘違いしていて,望んでいることと違っていたらごめんなさい.
--
永井 秀利  (nagai@ai.kyutech.ac.jp)
九州工業大学大学院情報工学研究院知能情報工学研究系知能情報メディア部門助教

From: OOTANI TAKASHI <tksotn@mail.117.cx>
Subject: [ruby-list:50903] 一時的にグローバル変数を差し替える
Date: Mon, 28 Sep 2020 22:19:21 +0900
Message-ID: <20200928221918.7D87.E53C48DF@mail.117.cx>

> 大谷ともうします。
> 
> 一時的にグローバル変数を差し替える、
> 
> File.open("xxx","w") do |$stdout|
>   something
> end
> 
> 的なこと(ブロックが終わると元に戻る)をしたいと思ったのですが、
> そういうことは出来ないので、
> 
> File.open("xxx","w") do |f|
>   $stdout = f
>   something
> end
> $stdout = STDOUT
> 
> とする事になるかと思います。
> が、ちょっと美しくない気がします。
> 
> 何か他の手段はありますでしょうか?
> 
> -- 
> tksotn
> 

In This Thread