2014-12-30 28 views
6

我在我的代碼,如設置符號:Ruby的符號設置

"name_of_symbol".to_sym 

然而,我的首席工程師在代碼審查作爲一種不好的做法把它撿起來,並問我設置一樣的符號:

:"name_of_symbol" 

當我問他爲什麼?他說這是不好的做法,但是當我問他剛纔說的是什麼原因時,這並不是一個令人滿意的答案。所以怎麼回事?有沒有什麼區別?

+5

它似乎是在你的工作場所的慣例,而不是一個「壞習慣」的問題。約定就是這樣,不需要爭論(爲什麼我們稱「樹」爲「樹」而不是「攙雜」?因爲我們同意使用「樹」)。有些人可能會說「可讀性」 - 但是沒有做過實際的科學研究來證明:sym語法更容易閱讀,這只是一個說法。另一方面,如果這個人拒絕給出一個解釋,那麼我們不能幫助你:(我的意思是:用':sym'定義一個符號,但是爲了明確地轉換爲符號,使用'.to_sym'。 –

+4

它不是不好的做法不好的做法是,當你是項目團隊的領導者時,不可能解釋一些事情 –

+0

這也不是一個好的做法,請注意,如果你的符號不包含空白和其他所以':foo_bar'確實沒有引號,你只需要引用':「foo bar」' –

回答

3

其他的答案正確地爭辯說:"foo bar"優於"foo bar".to_sym,因爲它是更清晰,更好的表達你的意圖,更具有可讀性,速度更快等,但還有一個原因:"foo bar".to_sym依靠String#to_sym方法,並有可能(雖然很遙遠),這種方法可能會被重新定義。這是爲什麼:"foo bar"原則上更好的做法的一個非美容理由。

+3

的確,雖然重新定義to_sym肯定會導致全球騷亂。 –

+0

它肯定會。這基本上是一個純粹的理論論證。 –

6

冒號表示符號。我不會稱之爲不合常規的做法,這可能會使代碼難以理解。

我知道:"Some weird stuff"是合法的,但不喜歡它,我個人寧願使用:Some_weird_stuff並將引號全部放在一起 - 當您不需要時使用引號只是增加噪音 - 我很抗噪。噪音是不好的做法,這會讓理解需要更長的時間。

有時候,當你匹配進來作爲字符串的東西,但爲了保持一致性,你想要的符號,那麼你沒有太多的選擇,但我不希望要問這個問題,FWIW。

當你有語法乾淨的符號,你可以使用

{ thing: "value" } 

語法,這是一種快樂和非常清晰,整潔。

有趣的是,雖然:

irb 
> class String ; def to_sym ; puts "bob" ; end ; end 
    => nil 
> "fred".to_sym 
    bob 
    => nil 
> :"fred" 
    => :fred 

所以鮑里斯點是一個有效的。

+0

我可能應該在我的問題中注意到,它在動態設置符號的時候會像array.each {| s | 「#{s}」to_sym –

+4

所以你有一個字符串,你在做:「#{s}」 - 親自我會用to_sym,插入一個字符串,然後在後臺調用to_sym ...有點毫無意義,我想:) – Ghoti

+3

換句話說,不要做':「#{s}」'或'「# {s}「。to_sym','s.to_sym' – Ajedi32

4

其中一個是Symbol字面值,另一個是您調用方法的字面值String

就個人而言,我覺得很奇怪寫String當你的意思寫了Symbol,只有然後立即轉換StringSymbol。爲什麼不首先寫一個Symbol?這使你的意圖更清晰。

+1

這不是奇怪的,例如,如果某種方法返回一個字符串,然後'method_which_returns_a_string.to_sym'是要走的方式 –

+0

@RustamA。加沙諾夫:但這不是這個問題的關鍵。問題是直接使用符號字面值,而不是字符串文字,然後將其轉換爲符號。顯然,完全不同的問題可能會有完全不同的答案。 –

2

這似乎是一個偏好問題,但我可以看到如何編寫符號作爲符號比編寫要更改爲符號的字符串更清晰。

而且,當你使用snake_case引號是不必要的。

  1. "name_of_symbol".to_sym
  2. :"name_of_symbol"
  3. :name_of_symbol

這是一個風格問題,但在我看來,3是三種最可讀的,簡潔的版本。如果「最佳實踐」意味着容易閱讀並因此保持,我會說3勝。