奇怪的ruby语法

时间:2010-06-16 11:50:16

标签: ruby syntax

Action Mailer Basics rails guide中的语法是什么?

class UserMailer < ActionMailer::Base
   def welcome_email(user)
      recipients    user.email
      from          "My Awesome Site Notifications <notifications@example.com>"
      subject       "Welcome to My Awesome Site"
      sent_on       Time.now
      body          {:user => user, :url => "http://example.com/login"}
   end
end

我应该如何理解构造,例如

from "Some text for this field"

是变量的赋值,称为“from”?

4 个答案:

答案 0 :(得分:15)

不,这是方法调用。方法的名称是from,参数是一个字符串。在Ruby中,方法调用的括号是可选的,所以

from "Some text for this field"

相同
from("Some text for this field")

Rails(以及许多Ruby库)喜欢以自然语言风格表达代码,因此无括号的版本读取更好,因此在示例中使用它的原因。

答案 1 :(得分:2)

调用带有参数from

的方法"Some text for this field"

该方法来自UserMailer扩展的ActionMailer::Base类。

在Ruby中,方法调用的括号是可选的,除非某些内容不明确,因此该语句等同于from(“此字段的某些文本”)

Rails的编码风格尽可能接近自然语言,因此除非必要,否则不使用括号。

调用此方法会将实例变量@from设置为您提供的值,以便以后在发送消息时使用。

通常,如果您拥有获取和设置变量的访问方法,则可以from=设置值,from返回值,但ActionMailer使用名为{{1}的内容定义adv_attr_accessor方法,这样如果你用一个参数调用它,那么它就像一个setter,但是如果你调用它没有参数,那么它就像一个getter。

这可以在actionmailer-2.x.x / lib / action_mailer / base.rb和actionmailer-2.x.x / lib / action_mailer / adv_attr_accessor.rb

中看到

答案 2 :(得分:1)

这不是作业。在Ruby中,使用赋值运算符=完成赋值,如下所示:

var = val

您可能正在考虑一些Lisp方言,其中赋值如下:

(def var val)

这只是一个简单的无接收消息发送。

在Ruby中,消息发送的一般语法是

receiver.selector(argument1, argument2)

但是,如果receiverself,则可以不使用receiver,所以

selector(argument1, argument2)

相同
self.selector(argument1, argument2)

[注意:这不是真的。在Ruby中,私有方法只能通过无接收者消息发送来调用,因此如果在此示例中self通过调用私有方法响应selector消息,则只有第一个变体可以工作,第二个变量将起作用提出NoMethodError例外。]

此外,如果没有歧义,你可以在这些参数周围留下括号:

receiver.selector argument1, argument2

如果你把这两件事放在一起,你现在可以看到

selector argument1, argument2

相当于

self.selector(argument1, argument2)

因此

from "Some text for this field"

相当于

self.from("Some text for this field")

Ruby的消息发送语法中有第三个快捷方式:如果消息发送的最后一个参数是Hash文字,那么你可以省略大括号。因此,上例中的最后一行也可以写成

  body          :user => user, :url => "http://example.com/login"

此外,在Ruby 1.9中,可以使用替代的Hash字面语法编写Symbol字面,其中所有键都是Hash

 { key1: val1, key2: val2 }

与旧语法

相同
{ :key1 => val1, :key2 => val2 }

这意味着,至少在Ruby 1.9中,最后一行也可以写成

  body          user: user, url: "http://example.com/login"

答案 3 :(得分:0)

您还可以调用from属性。它是电子邮件的属性,但它的实现方式是隐藏的(封装)。这是一件好事。这意味着如果Rails核心决定将@from更改为多个变量,则不需要更改任何代码。