Самая распространенная конструкция, которую я вижу при выполнении итерации файла:
File.open("etc/SERVER_LIST") do |f|
f.each_line do |line|
# do something here
end
end
Чтобы расширить вышеприведенное с некоторой более общей информацией по Ruby ... этот синтаксис эквивалентен:
File.open("etc/SERVER_LIST") { |f|
f.each_line { |line|
# do something here
}
}
Когда я впервые познакомился с Ruby, я понятия не имел, что такое | f | и | линия | синтаксис имел ввиду. Я знал, когда его использовать и как это работает, но не знал, почему они выбрали этот синтаксис. На мой взгляд, это одна из волшебных вещей в Ruby. Этот простой синтаксис выше на самом деле скрывает очень продвинутую концепцию программирования прямо под вашим носом. Код, вложенный в «do» / «end» или {}, называется блоком. И вы можете считать это анонимной функцией или лямбда-выражением. | F | и | линия | на самом деле синтаксис - это всего лишь дескриптор параметра, передаваемого блоку кода исполняющим родителем.
В случае File.open () анонимная функция принимает один аргумент, который является дескриптором подчиненного объекта File IO.
В случае each_line это функция-интегратор, которая вызывается один раз для каждой строки. Линия | это просто дескриптор переменной для данных, которые передаются с каждой итерацией функции.
О, и есть одна приятная вещь в do / end для File.open - он автоматически закрывает файл в конце.
Edit:
Ошибка, которую вы получаете сейчас, предполагает, что вызов SSH не оценивает лишние пробелы (перевод строки) в конце строки. Чтобы это исправить, просто сделайте
Net::SSH.start(line.strip, 'andex') do |ssh|
end