[#44431] コンストラクタの引数について&インスタンス変数の持ち方について — Akira Hayakawa <ruby@...>

度々オブジェクト指向についての質問ですいません。

17 messages 2008/01/04
[#44433] Re: コンストラクタの引数について&インスタンス変数の持ち方について — Yukihiro Matsumoto <matz@...> 2008/01/04

まつもと ゆきひろです

[#44469] pdf 作成 ライブラリ — "Luiz Aoki" <luizruby@...>

はじめまして、青木ルイスと申します、

14 messages 2008/01/12
[#44479] ファイル出力時のprintについて — m-hatake@... 2008/01/16

畠山と申します。

[#44483] format %g の丸めについて — 山崎雄介 <y-yamasaki@...>

山崎(ゆ)です。

14 messages 2008/01/16

[ruby-list:44482] Re: ファイル出力時のprintについて

From: KURODA Hiraku <hiraku@...>
Date: 2008-01-16 03:21:40 UTC
List: ruby-list #44482
こんにちは。黒田ひらく と申します。

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/
--------------------------------------------------

In This Thread