更传统的方式来写这个红宝石

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.localdoric-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"
)

【讨论】:

谢谢,你教了我一个很好命名的方法。

以上是关于更传统的方式来写这个红宝石的主要内容,如果未能解决你的问题,请参考以下文章

红宝石字符串#unpack

人工智能监考 VS 传统方式监考,你更喜欢哪一种?

使用 Monorepo 方式管理组件生态

使用100%面向过程的方式来写java程序

蜂鸟云重拳出击 地图编辑器革新室内地图传统方式

自定义红宝石注入方法没有产生预期的输出