了解大虾中的“隐式阻止”

时间:2018-12-28 03:46:32

标签: ruby block prawn

在大虾http://prawnpdf.org/manual.pdf的Prawn pdf示例中,手册广泛使用“隐式块”进行引用。对于这个问题,我一直无法使它与Prawn或任何Ruby代码一起使用。我收到此错误NoMethodError:main:Object

的未定义方法'foo'
# 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 :(得分:0)

正如我在评论中指出的那样,您的代码开箱即用,效果几乎完美。

该来源提供了一些有关用法的示例,例如here,但是在您深入研究细节并尝试一些示例之前,用法的实际差异并不清楚。

在下面的示例中,您可以看到这作为闭包的工作方式有所不同。我所做的唯一更改:

  • 使用实例变量@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',并且效果很好)