這個紅寶石代碼的工作,但有一個更傳統的或簡化的方式來寫它:更傳統的方式來寫這個紅寶石
options['host'] = begin
a == :jaxon ? 'jaxon-server16.jaxon.local' : 'doric-server5'
end
我只是覺得代碼是一種氣味,但我不能把我的手指在上面。
謝謝。
這個紅寶石代碼的工作,但有一個更傳統的或簡化的方式來寫它:更傳統的方式來寫這個紅寶石
options['host'] = begin
a == :jaxon ? 'jaxon-server16.jaxon.local' : 'doric-server5'
end
我只是覺得代碼是一種氣味,但我不能把我的手指在上面。
謝謝。
一般符號被用作散列鍵,因爲它們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.local
和doric-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)
沒有更多的信息,很難說哪一種方法是在你的情況最好。:-)
這是一個很好的答案:) –
我喜歡這一行 - *沒有更多的信息,很難說哪種方法是最好的在你的情況。*。爲了得到最好的答案,OP應該需要在他們的*問題製作中多做些工作。 –
哇意想不到的答案。特別喜歡使用帶默認值的提取。 – lukemh
這裏你不需要begin..end
。
options['host'] = a == :jaxon ? 'jaxon-server16.jaxon.local' : 'doric-server5'
我可能會在右側放置括號。沒有必要,只是爲了清楚。
options['host'] = (a == :jaxon ? 'jaxon-server16.jaxon.local' : 'doric-server5')
在所有應有的尊重,我發現其他值得回答的塞爾吉奧upvote,但我不會upvote也不會downvote這一個,因爲'開始...結束'塊不知何故呼籲我,帕斯卡lanuage的老粉絲,好於序列'... = a ==:jaxon? ......括號確實闡明瞭它,儘管「開始......結束」仍然有它的魔力。 –
@BorisStitnicky:是的,Pascal對人們這樣做:) –
人們認爲,儘管存在差異,Pascal和Ruby語法之間存在着深層次的聯繫(http://www.bitwisemag.com/2/Delphi - 對於Ruby-What-s-The),這可能是我最後習慣於Ruby的原因。 –
這是另一種方式來寫
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
理想情況下,這樣的設置應該在應用程序外部。他們不應該在代碼中。 –
這是'true'。 –
如果你想要的東西了可讀性圍繞着它,你可以共用一對與Hash#store
方法括號。
options.store("host",
a == :jaxon ? "jaxon-server16.jaxon.local" : "doric-server5"
)
謝謝,你在這裏教了我一個很好的命名方法。 –
不,它不聞,只是味道有點異國情調。 –
@BorisStitnicky:不過,我會說,'begin..end'這個用法並不是很普遍。 –