2014-10-10 3 views
0

У меня есть следующая команда, которая возвращает многострочную строку, и я хочу поместить ее в массив и перебрать по ней, причем каждая строка будет представлять собой один элемент.array.each возвращает только первое значение в Ruby

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, он всегда захватывает первое значение.

У меня такое чувство, что я сбрасываю всю строку как один элемент, но затем возвращаю обратно то, что, как я думал, должно. Я проверил документы 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

Можете ли вы включить блок кода, в котором вы фактически вызываете каждого из массива? – bigtunacan

ответ

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 

Но если это так, тогда экземпляр переменная не имеет никакого смысла.

Вам необходимо решить, что вы на самом деле хотите do.

+0

Спасибо! Я довольно новичок в Ruby, поэтому я все еще изучаю всю вещь var. В основном я в конечном итоге пишу код Python в Ruby ... не лучшая идея! – Matty

Смежные вопросы