У меня есть загадка с участием блоков и их раздача, нужна помощь в ее решении

Итак, я построил 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

было бы что-то более понятное.

Другие вопросы по тегам