2011-11-15 47 views
1

我正在學習ruby/rails - 我正在閱讀的這本書有一種跳過新語法的傾向。特別是,這一點;活動記錄語法解釋 - 初學者

person = Person.find(:first, :conditions => ["name = ?", "Mikey"]) 

從我可以告訴這個方法需要一個符號作爲它的第一個參數,看起來像一個項目的散列與符號/數組鍵/值。這是否正確,如果是這樣,爲什麼我突然能夠在這種情況下指定一個沒有大括號的散列?

+2

你可能想更接近'NEW' Active Record的語法,現在它會有點不同於:'person = Person.where('name =?','Mokey')。 ' - > http://guides.rubyonrails.org/active_record_querying.html –

+1

@Mr_Nizzle:在這個特殊情況下:'person = Person.where(:name =>「Mikey」)。first' – tokland

+0

錯打抱歉! –

回答

4

在Ruby方法參數中,放置在普通參數之後但在塊之前的任何key =>值對都捆綁到一個散列中。所以,如果你叫

my_method("hello", :something=>"yo!", :another_thing=>"bah!") 

這意味着my_method被傳遞兩個參數,一個字符串( 「你好」),和散列({:東西=> 「喲!」:another_thing =>「呸! 「})。

除了其他原因之外,這可以防止指示哈希參數的大括號和用於指示塊的花括號之間的混淆。它也提供了一種方便的方式來模擬「命名參數」,否則這些參數在Ruby中不存在。

+0

另外需要注意的是,自由格式散列參數必須是最後一個參數,否則您必須使用明確的大括號。 'foo(:a =>'b')'很好,但是'foo(:a =>'b',x)'不是並且必須是'foo({:a =>'b'},x )'而不是。由於這個原因,通常大多數接口都會定義參數散列。 – tadman

+0

事實上 - 這就是我在「正常論點之後」所傳達的意思。 –