2014-10-08 26 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