Ruby 如何基于类似于';*的全局变量筛选数组。rb';

Ruby 如何基于类似于';*的全局变量筛选数组。rb';,ruby,Ruby,以下是我的数据结构: array = [ ['foo.rb', 'file', '2432'], ['bar/', 'directory', '2048'], ['bla.yml', 'file', '10'], ['ble.rb', 'file', '2156'] ] 现在我希望找到所有的.rb文件 因此,我的过滤器如下所示: filter = '*.rb' 有没有办法在数组变量上正确地过滤这些内容 结果应该是: array = [ ['foo.rb', 'file', '24

以下是我的数据结构:

array = [

 ['foo.rb', 'file', '2432'],
 ['bar/', 'directory', '2048'],
 ['bla.yml', 'file', '10'],
 ['ble.rb', 'file', '2156']
]
现在我希望找到所有的.rb文件

因此,我的过滤器如下所示:

filter = '*.rb'
有没有办法在数组变量上正确地过滤这些内容

结果应该是:

array = [
 ['foo.rb', 'file', '2432'],
 ['ble.rb', 'file', '2156']
]
如果它是通过Dir.glob()实现的,这将很容易,但这是一个类似于 数据结构和我有点困惑,我怎么能轻松 对其进行筛选。

您可以使用在任何字符串上执行shell样式的文件名全局搜索:

>> array.find_all { |finfo| finfo[0].end_with?(".rb") }
=> [["foo.rb", "file", "2432"], ["ble.rb", "file", "2156"]]
files = [ [ 'foo.rb', 'file', '2432' ],
          [ 'bar/', 'directory', '2048' ],
          [ 'bla.yml', 'file', '10' ],
          [ 'ble.rb', 'file', '2156' ]
        ]

pattern = "*.rb"

files.select do |filename,|
  File.fnmatch?(pattern, filename)
end
# => [ [ 'foo.rb', 'file', '2432' ],
#      [ 'ble.rb', 'file', '2156' ] ]
注意
do | filename,|
中的逗号。这只是一种语法糖,它丢弃数组中除第一个元素以外的所有元素,使块等效于:

files.select do |arr|
  filename = arr[0]
  File.fnmatch?(pattern, filename)
end

您也可以使用该方法

files.select do |arr|
  filename = arr[0]
  File.fnmatch?(pattern, filename)
end
array = [
          ['foo.rb', 'file', '2432'],
          ['bar/', 'directory', '2048'],
          ['bla.yml', 'file', '10'],
          ['ble.rb', 'file', '2156']
        ]

array.select { |a| File.extname(a.first) == '.rb' }
# => [["foo.rb", "file", "2432"], ["ble.rb", "file", "2156"]]