У меня есть загадка с участием блоков и их раздача, нужна помощь в ее решении
Итак, я построил DSL, и часть его требует, чтобы пользователь DSL определил то, что я назвал "блоком записи".
writer do |data_block|
CSV.open("data.csv", "wb") do |csv|
headers_written = false
data_block do |hash|
(csv << headers_written && headers_written = true) unless headers_written
csv << hash.values
end
end
end
Блок писателя вызывается так:
def pull_and_store
raise "No writer detected" unless @writer
@writer.call( -> (&block) {
pull(pull_initial,&block)
})
end
Проблема двоякая, во-первых, это лучший способ справиться с подобными вещами, а во-вторых, я получаю странную ошибку:
undefined method data_block' for Servo_City:Class (NoMethodError)
Странно, потому что я вижу data_block
прямо там, или, по крайней мере, он существует до CSV
блокировать в любом случае.
То, что я пытаюсь создать, - это способ для пользователя написать блок-обертку, который одновременно оборачивается вокруг блока и выдает блок в блок, который оборачивается, вау, это глоток.
2 ответа
Внутренний я не хочет писать ответ до выяснения вопроса.
Другие мои пари, что примеры кода помогут прояснить проблему.
Я предполагаю, что блок записи имеет задачу сохранения некоторых данных. Не могли бы вы передать данные в блок в перечисляемой форме? Это позволило бы пользователю DSL написать что-то вроде этого:
writer do |data|
CSV.open("data.csv", "wb") do |csv|
csv << header_row
data.each do |hash|
data_row = hash.values
csv << data_row
end
end
end
Передача блоков не требуется.
Обратите внимание, что вы можете передать ленивую коллекцию, если имеете дело с огромными массивами данных.
Решает ли это вашу проблему?
Попытка открывать файл CSV каждый раз, когда вы хотите записать запись, кажется слишком сложной и может привести к снижению производительности (если запись не прерывается). Он также будет перезаписывать файл CSV каждый раз, если вы не измените режим файла с wb
в ab
,
Я думаю что-то простое, как:
csv = CSV.open('data.csv', 'wb')
csv << headers
writer do |hash|
csv << hash.values
end
было бы что-то более понятное.