【发布时间】:2018-03-29 03:06:26
【问题描述】:
加载文件时,我曾经做过一些变体:
first_file = "#{__dir__}/first_file.txt"
first_data = File.exist?(first_file) ? File.readlines(first_file) : []
second_file = "#{__dir__}/second_file.yaml"
second_data = File.exist?(second_file) ? YAML.load_file(second_file) : {}
这对我来说总是有点不对劲。需要检查文件是否存在是需要存在的东西,但我真正关心的是之后发生的事情。
最终我发现了内联rescue,并开始这样做:
first_file = "#{__dir__}/first_file.txt"
first_data = File.readlines(firs_file) rescue []
second_file = "#{__dir__}/second_file.yaml"
second_data = YAML.load_file(second_file) rescue {}
这对我来说更清楚——尝试做你真正想要的事情,如果你不能做其他事情,那就是你想要的后备。它比三进制更短更清晰。
但我在任何地方都重复了对avoid rescue in modifier form 的相同建议。我理解为什么会这样:它可以隐藏我们没有预测到的错误。
如果我可以将Errno::ENOENT 定义为内联表单中rescue 的错误,我会的。但据我所知,inline rescue 无法指定要从中拯救的错误。
那么有什么选择呢?我能做什么像内联rescue一样简短明了,但又没有缺点?
【问题讨论】:
-
回到你的老路。
-
我同意 Sergio 的观点,聪明的一个衬里很多次都不是那么可读。只需创建一些辅助方法。
-
我想我很清楚为什么我不想回到旧的方式。如果唯一的论点是“回到旧的方式”,还不如坚持新的方式。