【发布时间】:2013-04-27 20:10:04
【问题描述】:
在配对会话中,我们遇到了如何处理 ruby nil 以及 csv 解析(通过 ruby 的 CSV 包)是否会更好,如果它传回空字符串...
您可以在此处查看我们创建的规范:
https://github.com/mtc2013/LocalSupport/blob/seed-refactoring/spec/models/organization_spec.rb
我们正在尝试处理 csv 格式的文本文件中的数据,但如果传入的元素为 nil,我们提取邮政编码的处理将失败,因此我们有这些可悲的路径:
expect(Organization.extract_postcode('HARROW BAPTIST CHURCH, COLLEGE ROAD, HARROW')).to eq(nil)
expect(Organization.extract_postcode(nil)).to eq(nil)
实际上,我猜这个 extract_postcode 方法可能会返回一个空字符串。你可以在这里看到我们实现的代码:
https://github.com/mtc2013/LocalSupport/blob/seed-refactoring/app/models/organization.rb
def self.extract_postcode(address_with_trailing_postcode)
match = address_with_trailing_postcode && address_with_trailing_postcode.match(/\s*(\w\w\d\s* \d\w\w)/)
match && match[1]
end
我们仍然觉得这有点难看。在Objective C之类的东西中,您可以只调用nil对象上的方法,然后它们返回nil。在 ruby 中它们会抛出异常,因此我们使用“match && match[1]”操作进行检查,但是否推荐这样做?
另一种方法可能是确保 CSV 解析始终生成空字符串而不是 nil,但感觉我们仍然需要保护我们的代码不被传入的 nil。
我想我们最终的问题是这里的红宝石方式是什么?如果您有一个方法,它是否应该在通过 nil 时抛出错误?还是应该抓住它们然后返回 nil?如果是字符串操作方法,还是空字符串?
我想如果建议抛出 nil 错误,那么我们应该只专注于修复我们的 CSV 解析以将丢失的元素视为空字符串......或者更好的方法是捕获 nil 错误并重新抛出它们使用我们自己的自定义错误消息?
非常感谢任何建议
【问题讨论】:
-
为什么不用Ruby内置的
CSV? -
nil.to_s会产生一个空字符串,所以也许一个合适的to_s可以解决这个问题。 -
Neil - 我们正在使用 CSV 来获取 CSV 格式的数据
-
Steenslag - 很棒的建议 - 将不得不尝试...
-
@steenslag - 我们采纳了您的建议,这简化了很多代码 - 如果您想添加它作为答案,我可以给您打勾?