更传统的方式来写这个红宝石
Posted
技术标签:
【中文标题】更传统的方式来写这个红宝石【英文标题】:more conventional way to write this ruby 【发布时间】:2013-05-22 02:01:18 【问题描述】:此 ruby 代码有效,但是否有更传统或更简化的编写方式:
options['host'] = begin
a == :jaxon ? 'jaxon-server16.jaxon.local' : 'doric-server5'
end
我只是觉得代码是一种气味,但我不能指手画脚。
谢谢。
【问题讨论】:
不,它没有气味,只是味道有点异国情调。 @BorisStitnicky:不过,我想说begin..end
的这种用法并不是很普遍。
【参考方案1】:
这里不需要begin..end
。
options['host'] = a == :jaxon ? 'jaxon-server16.jaxon.local' : 'doric-server5'
我可能会在右侧加括号。没有必要,只是为了清楚起见。
options['host'] = (a == :jaxon ? 'jaxon-server16.jaxon.local' : 'doric-server5')
【讨论】:
恕我直言,我找到了 Sergio 提出的其他值得支持的答案,但我既不会赞成也不会反对这个答案,因为begin ... end
块以某种方式吸引了我,Pascal 语言的老粉丝, 比... = a == :jaxon ? ...
括号更清楚地说明了这一点,尽管begin ... end
仍然具有它的魔力。
@BorisStitnicky:是的,帕斯卡对人们这样做:)
人们坚持认为,尽管存在巨大差异,但还是有一个deep connection between Pascal and Ruby syntax,这可能是我最终对 Ruby 感到满意的原因。【参考方案2】:
通常使用符号作为哈希键,因为它们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应该在他们的question制作中做更多的工作。 哇,答案太棒了。特别喜欢使用 fetch 和默认值。【参考方案3】:这是另一种写法
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
【讨论】:
理想情况下,这样的设置应该在应用程序外部。它们不应该出现在代码中。【参考方案4】:如果您想用一些东西将其括起来以提高可读性,您可以使用Hash#store
方法共享一对括号。
options.store( "host",
a == :jaxon ? "jaxon-server16.jaxon.local" : "doric-server5"
)
【讨论】:
谢谢,你教了我一个很好命名的方法。以上是关于更传统的方式来写这个红宝石的主要内容,如果未能解决你的问题,请参考以下文章