这个ruby代码有效,但是有更常规或简化的方式来编写它:
options['host'] = begin
a == :jaxon ? 'jaxon-server16.jaxon.local' : 'doric-server5'
end
我只是觉得代码是一种气味,但我不能把手指放在上面。
感谢。
答案 0 :(得分:6)
此处您不需要begin..end
。
options['host'] = a == :jaxon ? 'jaxon-server16.jaxon.local' : 'doric-server5'
我可能把括号放在右边。没必要,只是为了清楚。
options['host'] = (a == :jaxon ? 'jaxon-server16.jaxon.local' : 'doric-server5')
答案 1 :(得分: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.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)
如果没有更多信息,很难说哪种方法最适合您的情况。 : - )
答案 2 :(得分: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
答案 3 :(得分:2)
如果您想要用可读性来包围它,可以使用Hash#store
方法分享一对括号。
options.store( "host",
a == :jaxon ? "jaxon-server16.jaxon.local" : "doric-server5"
)