【问题标题】:array.each only returns the first value in Rubyarray.each 只返回 Ruby 中的第一个值
【发布时间】:2014-12-05 16:02:47
【问题描述】:

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

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

代码工作正常,但仅适用于数组中的第一个元素,但它不会对每个元素都执行此操作,这就是为什么我认为我的数组分配很糟糕。

谢谢

【问题讨论】:

  • 你能把你实际调用每个数组的代码块包括进来吗?

标签: ruby arrays


【解决方案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

但如果是这样的话,那么 instance 变量就没有任何意义了。

你需要决定你真正想要做什么

【讨论】:

  • 谢谢!我对 Ruby 还很陌生,所以我还在学习整个 var 的东西。大多数情况下,我最终都会用 Ruby 编写 Python 代码……这不是最好的主意!
猜你喜欢
  • 1970-01-01
  • 2019-03-22
  • 1970-01-01
  • 2020-11-20
  • 1970-01-01
  • 1970-01-01
  • 2021-08-22
相关资源
最近更新 更多