2013-05-27 47 views
2

這個紅寶石代碼的工作,但有一個更傳統的或簡化的方式來寫它:更傳統的方式來寫這個紅寶石

options['host'] = begin 
    a == :jaxon ? 'jaxon-server16.jaxon.local' : 'doric-server5' 
end 

我只是覺得代碼是一種氣味,但我不能把我的手指在上面。

謝謝。

+1

不,它不聞,只是味道有點異國情調。 –

+2

@BorisStitnicky:不過,我會說,'begin..end'這個用法並不是很普遍。 –

回答

4

一般符號被用作散列鍵,因爲它們save memory and are a little faster for comparisons,並且begin..end塊不是必需的。因此,它變成了:

options[:host] = (a == :jaxon ? 'jaxon-server16.jaxon.local' : 'doric-server5') 

這是一個比較長的一段時間,在我的腦海以下解析簡單:

options[:host] = 'doric-server5' 
options[:host] = 'jaxon-server16.jaxon.local' if a == :jaxon 

最重要的是一個迭代,就是你有什麼似乎是半硬編碼值(jaxon-server16.jaxon.localdoric-server5)。您應該將這些存儲在常量或其他數據結構中,以便將這些數據集中在一個地方。例如,如果doric-server5有一天變成doric-server6,那麼只需將其更改爲某個類或文件的頂部。此外,它使代碼更易於閱讀,因爲它們現在擁有更多人性化的名稱,無論它們代表什麼。

# somewhere else: 
JAXON_SERVER = 'jaxon-server16.jaxon.local' 
DORIC_SERVER = 'doric-server5' 

options[:host] = DORIC_SERVER 
options[:host] = JAXON_SERVER if a == :jaxon 

既然我們已經處理了原動機,使其兩條線,我們可以回去一個,很好行:

options[:host] = (a == :jaxon ? JAXON_SERVER : DORIC_SERVER) 

如果你有很多這類陳述的,你可以做一個server散列,例如server[:jaxon] = 'jaxon-server16.jaxon.local',但如果你只有兩個,兩個字符串常量都可以。

在某些情況下,默認選項(在本例中爲DORIC_SERVER)會出現在默認值的任何位置,而不是直接將主機設置爲默認值。 Hash#fetch有兩個參數:一個鍵和一個默認值,如果該鍵不存在。

options[:host] = JAXON_SERVER if a == :jaxon 

# somewhere else: 
options.fetch(:host, DORIC_SERVER) 

沒有更多的信息,很難說哪一種方法是在你的情況最好。:-)

+0

這是一個很好的答案:) –

+0

我喜歡這一行 - *沒有更多的信息,很難說哪種方法是最好的在你的情況。*。爲了得到最好的答案,OP應該需要在他們的*問題製作中多做些工作。 –

+0

哇意想不到的答案。特別喜歡使用帶默認值的提取。 – lukemh

6

這裏你不需要begin..end

options['host'] = a == :jaxon ? 'jaxon-server16.jaxon.local' : 'doric-server5' 

我可能會在右側放置括號。沒有必要,只是爲了清楚。

options['host'] = (a == :jaxon ? 'jaxon-server16.jaxon.local' : 'doric-server5') 
+0

在所有應有的尊重,我發現其他值得回答的塞爾吉奧upvote,但我不會upvote也不會downvote這一個,因爲'開始...結束'塊不知何故呼籲我,帕斯卡lanuage的老粉絲,好於序列'... = a ==:jaxon? ......括號確實闡明瞭它,儘管「開始......結束」仍然有它的魔力。 –

+1

@BorisStitnicky:是的,Pascal對人們這樣做:) –

+0

人們認爲,儘管存在差異,Pascal和Ruby語法之間存在着深層次的聯繫(http://www.bitwisemag.com/2/Delphi - 對於Ruby-What-s-The),這可能是我最後習慣於Ruby的原因。 –

2

這是另一種方式來寫

options['host'] = case a 
when :jaxon 
    'jaxon-server16.jaxon.local' 
else 
    'doric-server5' 
end 

它有很多更多的行,但我喜歡它的可讀性。它也可以很容易地添加更多主機:

options['host'] = case a 
when :jaxon 
    'jaxon-server16.jaxon.local' 
when :staging 
    'staging-server1' 
else 
    'doric-server5' 
end 
+0

理想情況下,這樣的設置應該在應用程序外部。他們不應該在代碼中。 –

+0

這是'true'。 –

2

如果你想要的東西了可讀性圍繞着它,你可以共用一對與Hash#store方法括號。

options.store("host", 
    a == :jaxon ? "jaxon-server16.jaxon.local" : "doric-server5" 
) 
+0

謝謝,你在這裏教了我一個很好的命名方法。 –