2

此 ruby​​ 代码有效,但是否有更传统或简化的编写方式:

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

我只是觉得代码是一种气味,但我不能把手指放在上面。

谢谢。

4

4 回答 4

6

你不需要begin..end这里。

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

我可能会在右侧加括号。没有必要,只是为了清楚。

options['host'] = (a == :jaxon ? 'jaxon-server16.jaxon.local' : 'doric-server5')
于 2013-05-27T08:40:53.587 回答
4

通常将符号用作哈希键,因为它们节省内存并且比较快一点,并且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-server5doric-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)

如果没有更多信息,很难说哪种方法最适合您的情况。:-)

于 2013-05-27T10:21:16.727 回答
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
于 2013-05-27T08:52:28.110 回答
2

如果你想用一些东西来包围它以提高可读性,你可以与该Hash#store方法共享一对括号。

options.store( "host",
  a == :jaxon ? "jaxon-server16.jaxon.local" : "doric-server5"
)
于 2013-05-27T09:41:09.243 回答