array.each只返回Ruby中的第一个值

时间:2014-10-10 13:06:37

标签: ruby arrays

我有以下命令返回一个多行字符串,我想将它放入一个数组并迭代它,每行作为一个单独的元素。

def get_mnt_pts
`grep VolGroup /proc/self/mounts | awk '{print $2, $4}' | awk -F, '{print $1}' | awk '{print $1, $2}'`
end

命令返回的数据,是分组

之前数组的原始输入
/ rw
/home rw
/usr rw
/tmp rw
/var rw
/var/log rw

我有以下代码,它看起来像是采用该数据并将其拆分为换行符并将其放入数组中。然后我调用数组上的长度来确认,我可以拉出N值,但是当我执行array.each时它只能获取第一个值。

我有一种感觉,我将整个字符串作为单个元素转储,但然后.length返回我认为应该的东西。我已经查看了关于数组的Ruby文档以及字符串,看看我是否可以解决它。我相当肯定我正在创建错误的数组,但不确定如何。

mount_info = Array.new
mount_info = get_mnt_pts.split("\n")

puts mount_info.length  #this returns 6

mount_info.each do |pt|
  puts pt  #only puts the first value of / rw
end

当我打印出mount_info本身时,我得到以下内容

print mount_info
["/ rw", "/home rw", "/usr rw", "/tmp rw", "/var rw", "/var/log rw"]

puts mount_info
/ rw
/home rw
/usr rw
/tmp rw
/var rw
/var/log rw

print mount_info[4]  #returns back /var rw
puts mount_info[4]   #returns back /var rw

不知道从哪里看,任何方向都会很棒。最终结果是,对于数组中的每个元素,我想尝试在该目录中编写一个文件,以确认文件系统实际上是可写的。该数组包含一个挂载点列表,对于每个挂载点,我将编写一个Tempfile,这样下面的块将接收数组并迭代它。

def is_rw_test(mount_info)
  mount_info.each do |pt|
    Dir.exist? pt.split[0] || @crit_pt_test << "#{ pt.split[0] }"
    file = Tempfile.new('.sensu', pt.split[0])
    puts "The temp file we are writing to is: #{ file.path }" if config[:debug]
    file.write("mops") || @crit_pt_test <<  "#{ pt.split[0] }"
    file.read || @crit_pt_test <<  "#{ pt.split[0] }"
    file.close
    file.unlink
    return @crit_pt_test
   end
end

代码工作正常,但只针对数组中的第一个元素,但它不会为每个元素执行此操作,这就是为什么我认为我的数组赋值是borked。

由于

1 个答案:

答案 0 :(得分:1)

def is_rw_test(mount_info)
  mount_info.each do |pt|
    Dir.exist? pt.split[0] || @crit_pt_test << "#{ pt.split[0] }"
    # Etc
    return @crit_pt_test # ohai
   end
end

你有一个return,所以它会返回,而不再通过each进行迭代。

如果您想收集值,请执行以下操作:

def is_rw_test(mount_info)
  mount_info.collect do |pt|
    Dir.exist? pt.split[0] || @crit_pt_test << "#{ pt.split[0] }"
    # Etc
    @crit_pt_test
   end
end

但如果是这种情况,则实例变量没有任何意义。

您需要决定实际想要做什么