ruby-on-rails - チュートリアル - rubyonrails blog




神秘的なルビーの構文エラー (2)

私はもう少し混乱しています。これはほとんどRoRアクションメーラーガイドからのコピー/貼り付けですが、それでも構文エラーが発生します。

class Contact < ActionMailer::Base


  def contact a_name, a_company, a_phone, a_email, a_comments
    subject    "Contact request from #{name}"
    recipients "[email protected]"
    from       "[email protected]"
    sent_on    Time.now
    body       { :name => a_name, :company => a_company, :phone => a_phone, :email => a_email, :comments => a_comments }
  end

end

エラーは次のとおりです。

app/models/contact.rb:9: syntax error, unexpected tASSOC, expecting '}' body { :name => a_name, :company => a_company... ^ app/models/contact.rb:9: syntax error, unexpected tASSOC, expecting tCOLON2 or '[' or '.' ...{ :name => a_name, :company => a_company, :phone => a_phone,... ^ app/models/contact.rb:9: syntax error, unexpected tASSOC, expecting tCOLON2 or '[' or '.' ...ompany => a_company, :phone => a_phone, :email => a_email, :... ^ app/models/contact.rb:9: syntax error, unexpected tASSOC, expecting tCOLON2 or '[' or '.' ..., :phone => a_phone, :email => a_email, :comments => a_comme... ^ app/models/contact.rb:9: syntax error, unexpected tASSOC, expecting tCOLON2 or '[' or '.' ...email => a_email, :comments => a_comments, } ^

何か案は? 私はここで何が悪いのかわからない。


#bodyへの呼び出し(1)から{}削除し#body

(1)更新:このエラーは、Rubyでは{ }が2つの異なる意味を持つために発生します。ハッシュ値式とメソッドブロック。 プロシージャが詩モードで呼び出された場合(親がない場合)、パーサーがメソッド名の後に{を検出した場合、あいまいさがあります。 それはブロックの始まりですか?それともハッシュ式のパラメーターですか? あなたの特定のケースでは、残念なことに、それはブロックだという仮定です。

現時点で、ハッシュがメソッドへの最後の引数である場合、Rubyはハッシュ式の周りに{ }必要としません。 その結果、この問題を解決するには少なくとも2つの方法があります。(1) {}削除する - RubyはHashパラメータを渡していることを理解しています。 または(2)メソッドの親を追加します。 Railsが詩モードで通常どのように使用されるかを見てみると、文字を削除してCやJavaに追加するのではなく、巧妙なRubyパーサーを利用することは理にかなっているようです。


ハッシュ引数を使用してメソッド呼び出しを行っていることを明示するために、括弧body({...})を追加します。

そうでなければ、 {...}はおそらくbodyメソッドで渡される関数(またはラムダ、正式な用語はなんでも)と混同されます。body body { puts "Hello world!" } body { puts "Hello world!" }





ruby