Понимание "неявного блока", как видно в Prawn - PullRequest
0 голосов
/ 28 декабря 2018

В примере Prawn pdf от prawn http://prawnpdf.org/manual.pdf в руководстве часто используются "неявные блоки".Я никогда не мог заставить это работать с Prawn или любым кодом Ruby в этом отношении.Я получаю эту ошибку NoMethodError: неопределенный метод `foo 'для main: Object

# Assignment
pdf = Prawn::Document.new
pdf.text "Hello World"
pdf.render_file "assignment.pdf"
# Implicit Block
Prawn::Document.generate("implicit.pdf") do
 text "Hello World"
end
# Explicit Block
Prawn::Document.generate("explicit.pdf") do |pdf|
 pdf.text "Hello World"
end

Может кто-нибудь объяснить, что я делаю неправильно или еще лучше, что именно подразумевается под неявным блоком?Кажется, это экономит время, но я нигде не могу найти документацию по этому типу «неявного блока».

1 Ответ

0 голосов
/ 28 декабря 2018

Как я отмечал в своем комментарии, ваш код работает почти идеально, из коробки.

В источнике приведены некоторые примеры использования, такие как здесь , но фактическая разница виспользование не совсем понятно, пока вы не покопаетесь в деталях и не попробуете несколько примеров.

Вы можете увидеть разницу в том, как это работает как замыкание, в примере ниже.Единственные изменения, которые я сделал:

  • Использовал переменную экземпляра, @content в качестве примера того, что вы можете использовать в реальном приложении
  • Добавил экземпляр var в неявную версию
  • Удалены комментарии

Пример:

require 'prawn'

@content = "Hello World"

Prawn::Document.generate "example1.pdf" do
  # self here is set to the newly instantiated Prawn::Document
  # and so any variables in the outside scope are unavailable
  font "Times-Roman"
  draw_text @content, :at => [200,720], :size => 32
end

Prawn::Document.generate "example2.pdf" do |pdf|
  # self here is left alone
  pdf.font "Times-Roman"
  pdf.draw_text @content, :at => [200,720], :size => 32
end

Обратите внимание, что файл example1.pdf не содержит текста, поскольку внешняя область недоступна,Example2.pdf содержит текст.

Обратите внимание, что это прекрасно работает с настройками локальной переменной, отмеченными в примерах (например, вы можете установить content = 'hello' вне блоков, и все работает отлично)

...