Ruby 优雅的方式为版本字符串提供默认数组值
Posted
技术标签:
【中文标题】Ruby 优雅的方式为版本字符串提供默认数组值【英文标题】:Ruby elegant way to provide default array values for version string 【发布时间】: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”以后不会被改变
【参考方案1】:
怎么样(最低 Ruby 2.6)
version_string.split('.').then |x, y = '0', z = '0'| [x,y,z]
【讨论】:
以上是关于Ruby 优雅的方式为版本字符串提供默认数组值的主要内容,如果未能解决你的问题,请参考以下文章