2012-10-24 77 views
4

Rails中不一致的命名約定令我困惑。看起來語法到處都是。以下是一些示例:是一個變量符號,一個方法,爲什麼這有一個冒號,而不是?

爲什麼在下面的遷移中有逗號?而且,爲什麼關鍵字default之前沒有冒號?什麼是default關鍵字,方法或變量,符號?那是什麼東西?:

add_column :zombies, :rotting, :boolean, default: false 

下面是另一個例子:

爲什麼age:age(帶冒號)?爲什麼make_rotting之前用「:」來呼叫?

class Zombie < ActiveRecord::Base 
     before_save :make_rotting 

    def make_rotting 
     if age > 20 
     self.rotting = true 
     end 
    end 
end 
+0

要添加到以下答案:default/default是該列傳遞的默認值(如果該列未在創建時傳遞)。 –

+3

在嘗試理解Rails之前,您需要花時間閱讀[Ruby programming](http://www.ruby-doc.org/docs/ProgrammingRuby/)書。你的問題都是語言的基礎知識,並且可以通過任何Ruby教程進行解釋。除了「[Ruby編程](http://www.ruby-doc.org/docs/ProgrammingRuby/)」之外,請查看「[爲Ruby的原因(尖銳)指南](http://mislav.uniqpath.com /尖銳導/)」。 –

回答

8

紅寶石是很難爲Java和PHP的人。 :)

在Ruby中,並非所有事情都是如此。拿這個,例如:

before_save :make_rotting 

這是一個方法調用,當然。但這不是所調用的make_rotting方法。這是before_save:make_rotting是它的參數)。這是ActiveRecord中的一個所謂的鉤子。 before_save將採用方法名稱作爲參數,並在到達時動態調用它。

if age > 20 

這裏age是一個方法調用,而不是一個符號。它可以寫爲:

if age() > 20 

但括號是可選的。最後:

add_column :zombies, :rotting, :boolean, default: false 

該方法需要四個參數,最後一個是散列。哈希使用新的Ruby 1.9語法。以前它會被寫成這樣(用在正確的地方結腸和所有):

add_column :zombies, :rotting, :boolean, :default => false 

你應該閱讀Ruby編程的一本好書,而不是從堆棧溢出崗位知識刮片。 :)

+0

而且,雖然括號是可選的,但是許多我們的許多老戰士和許多語言戰爭的退伍軍人,無論他們是否需要,都傾向於自動添加括號。這是一個代碼維護工作,在運行時避免模糊。 –

+0

+1「你應該閱讀一本關於ruby編程的好書,而不是從stackoverflow文章中揪出一些知識。」 –

+0

@theTinMan:你是否告訴我你是一個老朋友,如果年齡大於20歲,如果年齡超過20歲,你會更喜歡嗎? :) –

3

三個主要的事情:

  1. 方法在Ruby中並不需要在他們的論據括號內。 before_saveadd_column是方法,因此:make_rottingbefore_save的參數。
  2. 任何以:開頭的符號都是符號。符號就像字符串,但是無論您在代碼中使用相同的符號多少次,它們只會在內存中分配一次。它們用於很多事情 - 通常用作散列鍵。
  3. 將散列作爲最後一個參數的Ruby方法在散列周圍不需要{}

所以這個:

add_column :zombies, :rotting, :boolean, default: false 

可以改寫爲:

add_column(:zombies, :rotting, :boolean, {default: false}) 
+0

「符號只是可以傳遞但不能改變的字符串。」不,它們不是字符串,但它們看起來很相似,並且經常以類似的方式使用。符號很好,在Ruby代碼中有很多健康的好處,所以不要害怕它們。 –

+0

新的編輯可能會更清晰一些。 – spike

相關問題