Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/google-cloud-platform/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails 从ruby中的数组获取最新版本_Ruby On Rails_Ruby_Rubygems_Chef Infra - Fatal编程技术网

Ruby on rails 从ruby中的数组获取最新版本

Ruby on rails 从ruby中的数组获取最新版本,ruby-on-rails,ruby,rubygems,chef-infra,Ruby On Rails,Ruby,Rubygems,Chef Infra,我有一个名为独特的\u版本的版本号数组,它不断增加: 1.7.16 1.7.14 1.7.13 1.7.12 1.7.9 1.7.7 1.7.5 1.7.4 1.7.2 1.6.2 1.2.1 1.2.0 1.1.0 0.0.1 我需要从阵列中获取最新的(1.7.16)。最优雅的ruby方式是什么?我通过以下代码获得此数组: require "json" require "open-uri" require 'openssl' string_object = open("https://xx

我有一个名为独特的\u版本的版本号数组,它不断增加:

1.7.16
1.7.14
1.7.13
1.7.12
1.7.9
1.7.7
1.7.5
1.7.4
1.7.2
1.6.2
1.2.1
1.2.0
1.1.0
0.0.1
我需要从阵列中获取最新的(1.7.16)。最优雅的ruby方式是什么?我通过以下代码获得此数组:

require "json"
require "open-uri"
require 'openssl'

string_object = open("https://xxx", :http_basic_authentication=>["xxx"], :ssl_verify_mode=>OpenSSL::SSL::VERIFY_NONE)
json_file = JSON.parse(string_object.read)
version_array = Array.new
json_file["results"].each do |version|
    version_array.push(version["version"].sub /-.*$/, '')
end
unique_versions=(version_array.uniq)
这似乎有效

unique_versions.sort_by { |version| version.split('.').map(&:to_i) }
 => ["0.0.1", "1.1.0", "1.2.0", "1.2.1", "1.6.2", "1.7.2", "1.7.4", "1.7.5", "1.7.7", "1.7.9", "1.7.12", "1.7.13", "1.7.14", "1.7.16"]
所以

请注意,您可以重写此部分

version_array = Array.new
json_file["results"].each do |version|
    version_array.push(version["version"].sub /-.*$/, '')
end
unique_versions=(version_array.uniq)
在某种程度上

 unique_versions = json_file["results"].map { |version| version["version"].sub /-.*$/, '' }.uniq

版本处理已经在
Gem::Version
(可能还有其他版本)中实现,无需重新发明轮子

string_versions.max_by{ |s| Gem::Version.new(s) } # => "1.7.16"

@Stefan注意到他在预处理步骤中剥离了
-beta.2
部分,这正是我所需要的。我建议使用
sort\u by
,因为它是O(n)而不是O(n²):
string\u versions.max\u by{s|Gem::Version.new(s)}
@Jordan:当然,谢谢。但是,
sort\u by
不是O(N^2)。@SergioTulentsev Ruby使用快速排序。也许你考虑的是一个平均情况,它是O(n logn)。我的缺点是没有更具体。当然,这取决于Ruby如何选择它的枢轴,我不确定。谢谢!作品很棒,但我不得不接受另一个,因为它很优雅:)别担心:)
string_versions.max_by{ |s| Gem::Version.new(s) } # => "1.7.16"