【发布时间】:2022-01-08 08:05:03
【问题描述】:
这是一个微不足道的问题,不确定我是否真的应该在这里问,但想看看是否有人有更优雅的方式用 ruby 编写此问题。
我有一个格式为 x.y.z 或 x.y 或 x 的版本字符串。我想要一种简单优雅的方式将其转换为一个数组,如果缺少段,则在其中插入默认 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