gpt4 book ai didi

ruby-on-rails - 我可以用鸭子类型(duck typing)改进这种方法吗?

转载 作者:数据小太阳 更新时间:2023-10-29 07:10:37 25 4
gpt4 key购买 nike

希望我没有误解“duck typing”的含义,但从我读到的内容来看,这意味着我应该根据对象如何响应方法而不是它是什么类型/类来编写代码。

代码如下:

def convert_hash(hash)
if hash.keys.all? { |k| k.is_a?(Integer) }
return hash
elsif hash.keys.all? { |k| k.is_a?(Property) }
new_hash = {}
hash.each_pair {|k,v| new_hash[k.id] = v}
return new_hash
else
raise "Custom attribute keys should be ID's or Property objects"
end
end

我想要的是确保我最终得到一个散列,其中键是表示 ActiveRecord 对象 ID 的整数。我不太喜欢使用 all? 遍历哈希键两次来确定是否需要提取 ID。

当然,我也会接受任何其他改进此代码的建议:)

最佳答案

如何编写此方法应取决于您是否期望在正常程序执行过程中抛出异常。如果你想要一个可读的异常消息,因为最终用户可能会看到它,那么手动抛出一个是有意义的。否则,我只会做这样的事情:

def convert(hash)
new_hash = {}
hash.each_pair { |k,v| new_hash[ k.is_a?(Integer) ? k : k.id ] = v }
return new_hash
end

这将完成完全相同的事情,如果数组键没有 id 字段,您仍然会得到一个异常。更好的是,这使用了更多的鸭子类型(duck typing),因为现在任何具有 id 字段的东西都是可以接受的,这比显式检查某些东西是属性要好。这使您的代码更加灵活,尤其是在进行单元测试时。

我们仍然对整数对象进行显式检查,但这种偶尔出现的特殊情况通常是可以接受的,尤其是在检查内置数据类型时。

关于ruby-on-rails - 我可以用鸭子类型(duck typing)改进这种方法吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/209478/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com