【发布时间】:2016-06-23 19:01:20
【问题描述】:
为什么header converters 的处理会随着从标头转换器返回的第一个非String 而停止?
详情
内置:symbol头转换器触发后,不会再处理其他转换器。似乎头转换器的处理停止,第一个转换器返回不是String 的任何内容(即,如果您编写返回Fixnum 或其他任何内容的自定义标头转换器,则行为相同) .
这段代码按预期工作,在:throw_an_exception中抛出异常
require 'csv'
CSV::HeaderConverters[:throw_an_exception] = lambda do |header|
raise 'Exception triggered.'
end
csv_str = "Numbers\n" +
"1\n" +
"4\n" +
"7"
puts CSV.parse(
csv_str,
{
headers: true,
header_converters: [
:throw_an_exception,
:symbol
]
}
)
但是,如果您切换标头转换器的顺序以使 :symbol 转换器排在第一位,则永远不会调用 :throw_an_exception lambda。
...
header_converters: [
:symbol,
:throw_an_exception
]
...
【问题讨论】:
-
任何不是来自@JEG2 的回答都可能纯属猜测。
-
@FrederickCheung 问题被表述为“为什么标头转换器的处理会随着标头转换器返回的第一个非字符串而停止?”——答案是“因为代码确实显式中断转换器在第一个非字符串上进行链式迭代。”不过,关于“为什么要那样做”的澄清并非来自作者,纯属猜测。