2012-05-12 24 views
2

我是Ruby的新手,並試圖讓我的頭瞭解它的一些語法。什麼時候使用符號代替Ruby中的變量是正確的?

爲什麼與異常對象變量此代碼的工作:

begin 
    puts Dir::delete 
rescue ArgumentError => e 
    puts e.backtrace 
end 

,但與符號?

begin 
    puts Dir::delete 
rescue ArgumentError => :e 
    puts e.backtrace 
end 

回答

3

符號是一個值。在你的例子中,你需要一個變量來存儲Error對象。您通常使用符號作爲字符串常量。

例如,如果您創建一個基本方向模塊,最好是用符號:north:south:east:west而不是字符串"north""south""east""west"

符號經常被用來作爲鍵在哈希:

my_hash = { a: 1, b: 7, e: 115 } 

這是非常有用的,以便了解何時用符號來閱讀GitHub上例如Ruby代碼。

1

我認爲e是存儲異常對象和:e是一種數據類型,因此是種值的變量。

一些例子

# standard way of assign variable will work 
e = ArgumentError.new 

# assign to data will not work 
:e = ArgumentError.new 
'e' = ArgumentError.new 
1 = ArgumentError.new 
1

符號代替變量名的 - 從來沒有(符號值,名稱是名蘋果和橘子。);

代替符號的變量 - 如你所願(如s = :name; puts params[s]);

代替字符串的符號 - 小心(如果您創建的符號太多,您可能會遇到麻煩)。

+0

嘿謝謝,但寫作s =:name的價值是什麼?當你寫's ='name'的時​​候會提出params [s]';把參數[s]'? – Roman

+1

@Arman:如果你有像{{name:'John'}'這樣的哈希值,'s ='name''將不起作用。 rails中的params對象是一種特殊的散列,它既可以使用字符串,也可以使用符號,但普通的常規散列可以區分這兩種散列。 –

+0

這很明顯,但還有一個問題:如何定義像'params'這樣的哈希? – Roman

2

因爲,就像你在問題本身寫的那樣,你需要一個Exception對象,而不是一個Symbol對象。

在您通過e對象,這是沒有的類型SymbolArgumentException類型,訪問backtrace救援塊。

那麼當解釋器分析:e時實際發生的是,間接創建一個新的Symbol對象並將其值設置爲:e。這就像寫23,其中間接創造一個Fixnum對象,並將其值設置爲23

但符號本身可以存儲在一個變量:

some_var = :e 
e = :e 

希望很清楚我的意思。

相關問題