神秘的ruby语法错误

时间:2010-12-27 18:22:35

标签: ruby-on-rails ruby

我感到困惑:这几乎是RoR动作邮件程序指南的复制/粘贴,但它会引发语法错误:

class Contact < ActionMailer::Base


  def contact a_name, a_company, a_phone, a_email, a_comments
    subject    "Contact request from #{name}"
    recipients "some@address.com"
    from       "some_other@address.com"
    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, } ^

任何想法?我无法弄清楚我在这里做错了什么。

2 个答案:

答案 0 :(得分:28)

添加括号body({...})以明确说明您正在使用散列参数进行方法调用。

否则,{...}可能与body方法中传递的函数(或lambda,无论是官方术语)混淆:body { puts "Hello world!" }

答案 1 :(得分:11)

从调用(1)移除{}#body


(1)更新: 发生此错误是因为{ }在Ruby中有两个不同的含义:哈希值表达式和方法块。如果在诗歌模式中调用过程(没有parens),那么如果解析器在方法名称后遇到{,则存在歧义。它是一个块的开头还是一个Hash表达式的参数?在你的具体案例中,一个不幸的假设是,这是一个障碍。

现在,当哈希是方法的最后一个参数时,Ruby不需要围绕Hash表达式{ }。所以结果是至少有两种方法可以解决这个问题:(1)删除{} - Ruby知道你传递了一个Hash参数;或(2)添加方法parens。看看如何在诗歌模式中使用Rails,删除字符并利用聪明的Ruby解析器而不是将它们添加回la C或Java似乎是有意义的。 功能