好的,所以我已經構建了一個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
區塊之前。
我想要創建的是一種讓用戶編寫一個封裝塊的方法,該封裝塊既可以環繞一個塊,又可以產生一個被包裹的塊,哇,這是一口。
嗯,我真的不明白你想要完成什麼。有多種可能的失敗原因,有些可能在你沒有顯示的代碼中。只是一個受過教育的猜測:你用一個接受block'data_block'的塊調用'writer',它接受一個塊。似乎DSL非常複雜。嘗試解除引用,像這樣:'writer do |&data_block |',然後用'data_block.call do | hash |'調用它。我沒看到的是'hash'被傳入的地方。(拉'是否這樣做?)爲什麼你不會首先將它傳遞給writer模塊,比如'writer do | data_block,hash |'' ? – Raffael
這就是爲什麼我問,這有點複雜。 'pull'接受一個塊併產生一個散列值;因此'@ writter.call'需要一個塊,它是傳遞給'data_block'的塊。我這樣做是因爲這是我可以考慮的唯一方法,允許我在'CSV'塊中包裝'pull'方法。否則,我必須創建一個csv對象,將散列追加到csv文件,然後關閉每個散列產生的散列。我覺得我太過於複雜,我可能會傳遞一個IO對象或東西,並使用它呢? – Thermatix