@ledsun blog

Hのキーがhellで、Sのキーがslaveだ、と彼は思った。そしてYのキーがyouだ。

実行するたびに決まった順番で値を返すRubyスクリプトはなぜか自分を書き換える

Webアプリケーションのテストに使う端末を決定するために、最初はruby -e 'p %w(iPad Firefox Android).sample'とランダムで値を返していました。 使っていると、ランダムよりは順番がよいと感じました。 また、順番も前回使った端末を覚えていて、その次から実行できると嬉しいです。 そして作ったのが、このスクリプトです。

script = File.read(__FILE__).split("__END__\n").first
value = DATA.gets

puts value

File.open(__FILE__, 'w') do 
  _1.write script
  _1.write "__END__\n"
  _1.write DATA.read
  _1.write value
end

__END__
iPad
Firefox
Android

実行すると次のように、一定の順番で値を返します。

~ ruby userAcceptanceTest/choice_test_devices.rb
iPad
~ ruby userAcceptanceTest/choice_test_devices.rb
Firefox
~ ruby userAcceptanceTest/choice_test_devices.rb
Android

実行すると実行したスクリプトが変更されるのは、見ていてなかなか気持ちが悪いものがあります。

gyazo.com

見た目は__END__以降が変わっているようですが、実際はファイル全体を書き直しています。

参考