Блоки - это рубиновая идиома для описания замыкания или блок кода, имеющий собственную область видимости (ему не нужно знать о других частях кода). Блоки имеют два стиля: если код занимает более одной строки, вы используете синтаксис do (с учетом структуры данных или некоторого перечислимого имени @entries)
@entries.each do |entry|
#do something
end
если он в одной строке, вы можете упростить блок как таковой
@entries.each{|entry| execute something here
}
в явном виде, то, что делает любой блок кода, - это передавать по одной записи за раз, назначаться записи и выполнять над ней операцию. Это как анонимная внутренняя функция.
Поначалу их немного сложно понять, но они действительно полезны во всем мире рубинов. У нас иногда бывает блокит.
В качестве варианта использования учтите, что мы хотим что-то сделать с каждым значением в массиве.
[1,2,3].map{|item| item+1} #=> takes each item in the array gets one added to it
что не так очевидно, так это то, что эта функция возвращает массив [2,3,4]
, потому что внутренняя функция заботится об итерации по структуре данных. Это гораздо удобнее и декларативнее, чем иметь другую функцию, которая работает над массивом, и еще одну, чтобы добавить одну к каждому элементу.
в примере csv вы берете каждую строку и добавляете ее в структуру данных с именем @books_in_stock
, но это не так явно, я думаю, как в приведенном мной примере. Посмотрите класс Enumearble http://apidock.com/ruby/Enumerable, где приведено много хороших примеров использования блоков.