2014-11-06 92 views
3

我很難理解何時以及何時不在Rails中使用符號。我明白,沒有許多方法,符號與字符串不會太不相似。我也明白這些符號能夠產生好的密鑰,因爲同名的符號佔用了內存中的一個地址。爲什麼回調在Ruby on Rails中使用符號

我很難明白的是爲什麼Rails的決定在某些情況下使用的符號。如果我有回調

before_action :ask_stack_overflow_question 

def ask_stack_overflow_question 
    puts "why did I just use a symbol?" 
end 

我不太明白爲什麼把對待方法作爲符號?爲什麼我需要保持方法不變?

我無法找到的文檔中找到答案。

謝謝

+0

您正在使用哪種版本的導軌? – Surya 2014-11-06 18:26:24

+0

我正在使用4.1.7 – Deepak 2014-11-06 18:30:39

+0

很可能是因爲單個冒號('before_action:ask_stack_overflow_question')比字符串('before_action'ask_stack_overflow_question'或'before_action「ask_stack_overflow_question」)在視覺上噪音更小'並且讓人們想到符號參數作爲語言的一部分,而不是程序的一部分。 – 2014-11-06 18:41:42

回答

7

這並不像它看起來的那麼複雜。

當調用before_action你不想立即執行的方法,但你要描述的動作要莫名其妙地執行。這裏使用的符號表示要調用的方法的名稱名稱

因此,如果這被捕獲爲name,那麼稍後在代碼中的某個地方,這將在適當的時間轉換爲send(name)

這兩者之間有很大的區別。眼前的版本是:

before_action method_name 

其中有立即執行method_name,如紅寶石將被迫運行method_name找出它返回的效果,然後傳遞通過對before_action作爲參數。

遞延約定是:

before_action :method_name 

這簡直是一種禮貌的請求before_action,在符號作爲參數傳遞。你將它留到before_action來處理這個問題,但它看起來合適,所以它將來可能會或可能不會執行這種方法,這取決於情況。

這是它的工作原理是Ruby與非常少數例外。我能想到的唯一一個並不立即執行的方法是立即指定而不是作爲代表性符號的構造是奇怪的alias構造。

+0

我認爲符號就像一個指針,它沒有任何意義使用:ApplicationController上的索引和UserController應該指向與符號相同的方法在整個ruby會話中是相同的,但不知何故它們能夠調用它們自己的方法。 現在我知道它只是告訴名稱的發送方法。 – Kshitij 2017-02-03 09:27:33

+0

在Ruby術語中,':index'是一個符號,它是「內部化字符串」的另一個名稱,它是輕量級版本。在Rails中,字符串和符號之間的區別有時被用來表示意圖:符號意味着「運行此方法」,字符串意味着「使用這個東西」,儘管這個約定在不同的方法中差別很大,所以諮詢文檔是必不可少的。 – tadman 2017-02-05 20:12:47

0

這是引用的東西最便宜的方式,隨後符號是有道理的。

通常有不使用符號的可能性:

before_action do 
    # do something 
end 

但隨着這樣一來,你就不能重用方法,以防萬一。你也不會失去某種表現力。

兩個選項是正確的,在我看來,無論您選擇何種選項,最重要的是你的代碼是可讀的,而不是多餘的。

1

如果read this code which defines before_action on the second line

[:before, :after, :around].each do |callback| 
    define_method "#{callback}_action" do |*names, &blk| 
     _insert_callbacks(names, blk) do |name, options| 
     set_callback(:process_action, callback, name, options) 
     end 
    end 

其中要求set_callback method here,被調用的方法時調用get_callback method。這創建了一個回調鏈。這個回調鍊形成here,後來被this method用於執行。現在,您可以傳遞一個字符串或作爲符號。但是,首選的方法是傳遞符號,因爲它們是不可變的,並且在執行過程中不能更改。

1

Ruby符號是立即值。關於符號的重要事情就是符號本身。所以在某些地方重要的地方,你可以使用符號。

內存明智的,它是什麼,是永久性的(該程序的運行期間),是不可改變的,始終是同一個對象。

字符串沒有這種奢侈的紅寶石。 「這個字符串」和「這個字符串」將是兩個單獨的對象,並受垃圾收集。

:this_symbol不會受到垃圾收集,始終是相同的對象,並且因此是存儲器高效。該符號可以引用名稱this_symbol的本地變量或名稱this_symbol或任何其他命名對象的方法,但可以由完全相同的對象引用,即:this_symbol。

何時不使用符號?當你需要暫時擁有許多這種內存時,一次或幾次使用時,在長時間運行的程序中最終會填充內存,而不希望爲其他用途恢復內存。

因此,他們並沒有真正使用符號作爲一種方法,但是Ruby通過他們的符號做參考方法名。我認爲改變的方法名稱不會像方法名稱一樣有用。

相關問題