此 ruby 代码有效,但是否有更传统或简化的编写方式:
options['host'] = begin
a == :jaxon ? 'jaxon-server16.jaxon.local' : 'doric-server5'
end
我只是觉得代码是一种气味,但我不能把手指放在上面。
谢谢。
你不需要begin..end
这里。
options['host'] = a == :jaxon ? 'jaxon-server16.jaxon.local' : 'doric-server5'
我可能会在右侧加括号。没有必要,只是为了清楚。
options['host'] = (a == :jaxon ? 'jaxon-server16.jaxon.local' : 'doric-server5')
通常将符号用作哈希键,因为它们节省内存并且比较快一点,并且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)
如果没有更多信息,很难说哪种方法最适合您的情况。:-)
这是另一种写法
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
如果你想用一些东西来包围它以提高可读性,你可以与该Hash#store
方法共享一对括号。
options.store( "host",
a == :jaxon ? "jaxon-server16.jaxon.local" : "doric-server5"
)