我是Ruby的新手,並試圖讓我的頭瞭解它的一些語法。什麼時候使用符號代替Ruby中的變量是正確的?
爲什麼與異常對象變量此代碼的工作:
begin
puts Dir::delete
rescue ArgumentError => e
puts e.backtrace
end
,但與符號?
begin
puts Dir::delete
rescue ArgumentError => :e
puts e.backtrace
end
我是Ruby的新手,並試圖讓我的頭瞭解它的一些語法。什麼時候使用符號代替Ruby中的變量是正確的?
爲什麼與異常對象變量此代碼的工作:
begin
puts Dir::delete
rescue ArgumentError => e
puts e.backtrace
end
,但與符號?
begin
puts Dir::delete
rescue ArgumentError => :e
puts e.backtrace
end
符號是一個值。在你的例子中,你需要一個變量來存儲Error對象。您通常使用符號作爲字符串常量。
例如,如果您創建一個基本方向模塊,最好是用符號:north
,:south
,:east
,:west
而不是字符串"north"
,"south"
,"east"
和"west"
。
符號經常被用來作爲鍵在哈希:
my_hash = { a: 1, b: 7, e: 115 }
這是非常有用的,以便了解何時用符號來閱讀GitHub上例如Ruby代碼。
我認爲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
符號代替變量名的 - 從來沒有(符號值,名稱是名蘋果和橘子。);
代替符號的變量 - 如你所願(如s = :name; puts params[s]
);
代替字符串的符號 - 小心(如果您創建的符號太多,您可能會遇到麻煩)。
因爲,就像你在問題本身寫的那樣,你需要一個Exception對象,而不是一個Symbol對象。
在您通過e
對象,這是沒有的類型Symbol
ArgumentException
類型,訪問backtrace
救援塊。
那麼當解釋器分析:e
時實際發生的是,間接創建一個新的Symbol
對象並將其值設置爲:e
。這就像寫23
,其中間接創造一個Fixnum
對象,並將其值設置爲23
但符號本身可以存儲在一個變量:
some_var = :e
e = :e
希望很清楚我的意思。
嘿謝謝,但寫作s =:name的價值是什麼?當你寫's ='name'的時候會提出params [s]';把參數[s]'? – Roman
@Arman:如果你有像{{name:'John'}'這樣的哈希值,'s ='name''將不起作用。 rails中的params對象是一種特殊的散列,它既可以使用字符串,也可以使用符號,但普通的常規散列可以區分這兩種散列。 –
這很明顯,但還有一個問題:如何定義像'params'這樣的哈希? – Roman