【问题标题】:Short alternative to ternary and rescue in modifier form修饰符形式的三元和救援的简短替代
【发布时间】: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 的观点,聪明的一个衬里很多次都不是那么可读。只需创建一些辅助方法。
  • 我想我很清楚为什么我不想回到旧的方式。如果唯一的论点是“回到旧的方式”,还不如坚持新的方式。

标签: ruby rescue


【解决方案1】:

如果我真的担心这些行的可读性,我会创建一些辅助方法。

def read_with_fallback(filename, fallback)
  File.exist?(filename) ? yield(File.open(filename)) : fallback
end

def safe_read_lines(filename)
  read_with_fallback(first_file, []) {|file| file.readlines }
end

def safe_read_yaml(filename)
  read_with_fallback(second_file, {}) {|file| YAML.parse(file.read) }
end

first_file = "#{__dir__}/first_file.txt"
first_data = safe_read_lines(first_file)

second_file = "#{__dir__}/second_file.yaml"
second_data = safe_read_yaml(second_file)

但是,如果我只有其中的一两个,并且不必在其他所有方法中重复它们,那么我就不会费心了。您的第一个表单“足够好”。

【讨论】:

  • “我会创建一些辅助方法”——我的眼睛在流血 :) 你真的认为,对于这段代码的未来读者来说神秘的safe_read_lines(谁完成了至少 1st level in ruby​​) 比 File.readlines(firs_file) rescue []? 更具可读性
  • @mudasobwa:毫无疑问,命名可以改进。但是,是的,我确实相信“尽最大努力阅读此 yaml 文件”的概念在给定名称时会更好读。更高层次的抽象。 YAML.load_file(second_file) rescue {} - 这用至少 4 个“位”信息表示,而实际上它只是一个“读取 yaml 文件”。为什么要在脑海中编译代码。在可以避免的情况下尝试推断代码的含义?另外,请阅读最后一部分:)
  • @mudasobwa:这种方法也没有什么“神秘”之处。它的定义是一个按键(对于那些有动力编辑器的人):)
  • @user137369¯\_(ツ)_/¯
猜你喜欢
  • 1970-01-01
  • 2013-09-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-04-10
  • 1970-01-01
  • 1970-01-01
  • 2021-10-24
相关资源
最近更新 更多