From: KURODA Hiraku Date: 2008-01-16T12:21:40+09:00 Subject: [ruby-list:44482] Re: ファイル出力時のprintについて こんにちは。黒田ひらく と申します。 m-hatake@jaist.ac.jp さんは書きました: > print (rand * 100).truncate,"\n" > > とするとエラーはでないのですが、 > > open("test.dat","w") do |out| > out.print (rand * 100).truncate,"\n" > end > > とすると > 2:warning: don't put space before argument parentheses > 2:syntax error > > というエラーがでます。 うちの環境では次のように表示されました。 ~$ ruby -v ruby 1.8.6 (2007-06-07 patchlevel 36) [i486-linux] ~$ ./test.rb ./test.rb:3: warning: don't put space before argument parentheses ./test.rb:3: syntax error, unexpected '\n', expecting tCOLON2 or '[' or '.' まずwarningですが、元の書き方だと (rand*100) が引数の中の式の為のカッコなのか、関数呼び出しのための カッコなのか(人間が)誤認するからではないかと思います。実際 out.print (1+1)*2 と書いたときに、期待するのに多分 out.print( (1+1)*2 ) だと思うのですが、実際には (out.print(1+1))*2 と実行されて、nil*2が出来ない旨の例外が投げられます。 今回の場合ですと、元の書き方は out.print().truncate, "\n" と解釈されるので、 ,"\n" の部分でsyntax errorが発生しています。 out.print rand * 100.truncate,"\n" out.print((rand * 100).truncate,"\n") と書けばどちらもwarningは出ません。ただし、1つ目の方はrand*(100.truncate)として実行されるので適切で はないでしょう。 ---- ところで、僕の手元の環境では #!/usr/bin/ruby print (rand * 100).truncate,"\n" open("test.dat","w") do |out| print (rand * 100).truncate,"\n" end と書くと、2つめのprintだけがエラーになってしまいます。 むしろ、1つ目のprintがエラーにならないのが不思議なのですが、どなたか理由をご存知の方がいらしたら教 えていただければと思います。 -- -------------------------------------------------- 黒田 拓(くろだ ひらく) hiraku@sapporo.email.ne.jp http://www.hinet.mydns.jp/ --------------------------------------------------