2014-10-08 74 views
2

可能明显;我对Rails很新。Ruby on Rails的syntax-做时:来v在变量后?

我的问题:是否有一个规则或一个简单的方法时要记住一个冒号到来之前或之后的变量?以下是我从application_controller处谈到的一个例子。

protect_from_forgery with: :exception 

,我指的是with::exception

有没有办法记住,当结肠正值年底,当它是在开始的时候,或者是它只是你一个可变的变量的基础上记忆的东西吗?另外,为什么在这里连续发现?

我真的想了解这个:)谢谢!

回答

3

with: :exception只是为:with => :exception

语法糖有没有真正的好处比便利性和减少键入此等。如果你需要继续支持ruby 1.8,那么你应该继续使用旧的语法。

您在本例中,实现您提供

protect_from_forgery with: :exception 

这是正在传递一个变量,这恰好是一个散列的方法。所以以下是等同的。

protect_from_forgery with: :exception 
protect_from_forgery(with: :exception) 
protect_from_forgery(:with => :exception) 
protect_from_forgery({:with => :exception}) 

当我沿着线路通知时,每个输入都有点儿打字,但他们都在做同样的事情。每个通过一个单一键/值对的散列传递给protect_from_forgery。

回到你的左和右的原始问题,只要记住左边是你的钥匙,它是一个符号。

所以下面的例子都是有效的哈希值。

foo = {bar: "baz"} 
foo = {bar: 1} 
foo = {bar: :baz} 
foo = {bar: some_object} 

然后意识到这是一个符号键散列到一些东西,符号,数字,字符串,对象的快捷方式,等等...这完全可以取代旧的语法{:巴=> SOME_THING}

如果您的密钥不是符号,您需要使用旧的语法。

foo = {1 => :bar} 
foo = {"string" => some_object} 
+0

这是'{:with =>:exception}'语法糖''。 – sawa 2014-10-08 17:04:57

+0

句法糖意味着一件事与另一件事是一样的,但工作较少。有关语法糖的更完整解释,请参阅http://en.wikipedia.org/wiki/Syntactic_sugar。 – bigtunacan 2014-10-08 17:06:32

+0

是不是省略了大括号较少的工作? – sawa 2014-10-08 17:07:42

3

如果我们增加我们这里省略,如Ruby的语法允许,我们会得到这样的事情的所有符号:

protect_from_forgery({ :with => :exception }) 

{ :with => :exception }是一个HashMap,俗称红宝石之间的“哈希” devs:一组键值对。在这里,我们有一对散列:价值:exception的密钥:with

如果散列是方法调用中的最后一个参数,则不需要在{}中包含散列。那么,现在让我们忽略大括号:

protect_from_forgery(:with => :exception) 

这看起来有点丑,这么多字是刚刚的Ruby语法的一部分。但是,如果在一对值(key => value)键是符号(:thing),存在的Ruby一种语法用于定义一个键 - 值对:在互联网此

protect_from_forgery(with: :exception) 

然而,许多代码示例中不使用替代语法。显然,赞成与旧版本的Ruby兼容(1.9之前)。今天,在大多数情况下,使用这种旧版本的Ruby是不切实际的,所以现在取决于个人的喜好。

有时我们可以省略包含参数的括号,只要这样不会使代码含糊不清或不易读。这里没有。但如果你决定自己使用它,请特别注意这个功能。

protect_from_forgery with: :exception 

Ruby Style Guide建议只省略括号如果您正在使用某种形式的DSL的基于Ruby。问题是,什么是DSL,什么不是。在这里我们可以称之为“Rails控制器定义DSL”,我们通过发出DSL命令来描述一个类。可能有资格作为DSL使用。

+0

使用带花括号的散列,但省略参数括号由于块与模糊不符而不合语法。如果你改变你解释的顺序(以及由此导致的例子),那么这将是一个很好的答案。 – sawa 2014-10-08 17:12:49

+0

@sawa够公平的,没有想到顺序,只是发布了关于我们在这里有什么句法结构的细节。现在你提到它,我已经用稍微不同的顺序和一些参考来更新答案。 – 2014-10-08 19:05:33