通常使用符号作为哈希键,因为它们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)
如果没有更多信息,很难说哪种方法最适合您的情况。 :-)