【问题标题】:Ruby elegant way to provide default array values for version stringRuby 优雅的方式为版本字符串提供默认数组值
【发布时间】:2022-01-08 08:05:03
【问题描述】:

这是一个微不足道的问题,不确定我是否真的应该在这里问,但想看看是否有人有更优雅的方式用 ruby​​ 编写此问题。

我有一个格式为 x.y.zx.yx 的版本字符串。我想要一种简单优雅的方式将其转换为一个数组,如果缺少段,则在其中插入默认 0 值。我有几种不同的方法可以做到这一点,但我希望有一些更清洁的东西。 Atm 我目前的解决方案是这样的

version_string.split('.').each_with_index.with_object(['0','0','0']) { |(segment, i), version_array| version_array[i] = segment }

似乎工作正常,我总是可以转移到一个简单的方法调用来使代码看起来很干净,但是使用 each_with_index 和 `with_object 有点让我烦恼。只是想看看 Ruby 社区的其他人是否有什么要补充的

【问题讨论】:

  • 我真的不觉得这特别优雅,但您可以使用正则表达式将“1”、“1.2”、“1.2.3”解析为 3 项列表,其中缺少数字零。 /(\d)(?:\.(\d))?(?:\.(\d))?/.match(string)[1..-1] 例如对于string="1.2",它将返回[1,2,nil]。然后你可以在加入之前对结果执行map { |num| num || 0 }。我希望有一种方法可以像 ljust 那样处理数组,但我什么也没看到。
  • 你为什么不用像versionomy这样的宝石?
  • /(\d+).?(\d+)?.?(\d+)?/.match(str).captures.map {|s| s.to_i.to_s} 可以。 @maxpleaner 你可以分两步模拟这个概念str.scan(/\d+/).concat(['0','0','0']).first(3)['0','0','0'].unshift(*str.scan(/\d+/)).first(3)
  • 我能想到的最棒的东西是str.split(?.).+([?0]*3)[..2],但这假设“0”以后不会被改变

标签: arrays ruby default-value


【解决方案1】:

怎么样(最低 Ruby 2.6)

version_string.split('.').then { |x, y = '0', z = '0'| [x,y,z] }

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-11-26
    相关资源
    最近更新 更多