Ruby 优雅的方式为版本字符串提供默认数组值

Posted

技术标签:

【中文标题】Ruby 优雅的方式为版本字符串提供默认数组值【英文标题】:Ruby elegant way to provide default array values for version string 【发布时间】: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”以后不会被改变 【参考方案1】:

怎么样(最低 Ruby 2.6)

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

【讨论】:

以上是关于Ruby 优雅的方式为版本字符串提供默认数组值的主要内容,如果未能解决你的问题,请参考以下文章

Ruby:将String转换为嵌套数组的Integer值

ruby 将哈希值转换为排序的字符串数组,以便与另一个哈希值进行比较

C++ 更优雅的方式在多维数组中设置默认值

从数组中删除仅大小写不同的字符串值(Ruby)

如何在 Ruby 中将十进制值数组转换为 MAC 地址?

查找Ruby数组的字符串索引[重复]