こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

解決済みの質問

Rubyの構文?言語仕様?

Rubyの以下コードについて質問です。

#!/ruby/bin/ruby

print "content-type: text/html\r\n\r\n";
puts "Hello World!"
begin
def foo
x =0
(0...10).each do |value|
print value.to_s +"の時"+ x.to_s + "<br />"
end
end

foo
rescue =>e
print e.class.to_s+ "<br />"
print e.message
end


上記コードを実行すると以下のような例外を取得します
NoMethodError
undefined method `+@' for "\343\201\256\346\231\202":String
どうやら上記コードの
print value.to_s +"の時" の部分の  +"の時" という箇所が問題のようなのですが
上記箇所を + "の時" のように 文字列連結子の +と "の間に半角スペースを
入れるとうまく実行されます。
いったい原因はなんなのでしょうか?
細かい箇所ですが是非、ご教授ください。

投稿日時 - 2011-10-02 23:15:08

QNo.7048330

すぐに回答ほしいです

質問者が選んだベストアンサー

単項演算子の+と見なされるためです。
a = +3
みたいな。

構文としては、
print value.to_s +"の時"+ x.to_s + "<br />"
が、
print value.to_s( (+"の時")+ x.to_s + "<br />")
のように解釈されています。

メソッド呼び出しの括弧を省略できるRubyでは、曖昧な構文の時に空白をみて解釈を決めています。
print value.to_s + "の時"+ x.to_s + "<br />"
print value.to_s+"の時"+x.to_s+"<br />"
print value.to_s() +"の時"+ x.to_s() + "<br />"
ならOK。

下記のどちらかに書法ルールを統一していれば普通は大丈夫です。
・二項演算子の前後に必ず空白を入れない
・二項演算子の前後に必ず空白を入れる

投稿日時 - 2011-10-02 23:32:47

お礼

ありがとうございます!
理解できました。
悩んでいたのでたすかりました。

投稿日時 - 2011-10-03 20:00:55

ANo.1

このQ&Aは役に立ちましたか?

1人が「このQ&Aが役に立った」と投票しています

回答(1)