Ruby 为什么在rails logger中使用块而不是字符串?

Ruby 为什么在rails logger中使用块而不是字符串?,ruby,debugging,ruby-on-rails-4,Ruby,Debugging,Ruby On Rails 4,在轨道上 当我们使用Logger类时,我们总是在块而不是字符串中定义- Rails.logger.error { error.message } 不是这样- Rails.logger.error "error.message" 其背后的原因是什么?请查看此处的文档: 另一个潜在的陷阱是,如果您有许多对记录器的调用 在您的代码中如下所示: 在上面的示例中,即使 允许的输出级别不包括调试。原因是Ruby 必须计算这些字符串,包括实例化 有点重的字符串对象和插值变量,以及 这需要时间。因此,建议

在轨道上

当我们使用Logger类时,我们总是在块而不是字符串中定义-

Rails.logger.error { error.message }
不是这样-

Rails.logger.error "error.message"

其背后的原因是什么?

请查看此处的文档:

另一个潜在的陷阱是,如果您有许多对记录器的调用 在您的代码中如下所示:

在上面的示例中,即使 允许的输出级别不包括调试。原因是Ruby 必须计算这些字符串,包括实例化 有点重的字符串对象和插值变量,以及 这需要时间。因此,建议将块传递给 记录器方法,因为只有在输出电平为 相同或包含在允许的级别中(即延迟加载)


因此,您可以使用任何一种方法—传入
字符串
或传入
。块是一种优化,它将延迟插入字符串(以及示例中的任何属性信息)直到Rails知道它将根据您的日志详细性设置实际记录信息。

这由Ruby的标准
记录器
类的源代码证实,例如-您可以看到,如果未处理消息的当前严重性级别,则不会调用
yield
logger.debug "Person attributes hash: #{@person.attributes.inspect}"