gpt4 book ai didi

ruby - 如何检查变量是否真的 responds_to :dup?

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

我想使用 value.respond_to?(:dup) ? value.dup : value 以检查我是否可以复制一个对象,但它在 bool 值、nil 或类似的“基元”上出现 TypeError 失败。

我最终得到了:

begin
value = value.dup
rescue
#ignore, use the original if no dup-able (e.g nil, true, etc)
end

有没有更好的方法?

奖励:为什么它响应 :dup

不深dup,只是为了问题。

编辑:想法:

  • obj.class.methods.include? :new 很好,但有点太黑了,我认为它的性能很差
  • Marshal 看起来也有点矫枉过正
  • 一线救援可能是最好的解决方案,但目前无法输入特定的一线救援(IIUC matz is on that!),正如@JörgWMittag 提到的那样,这是错误的。
  • 我个人认为 dup 在对象级别定义是错误的。

所以,引用@Linuxios

There isn't really a better way

最佳答案

你可以这样写成一行:

value = value.dup rescue value

非常清楚。

定义一个 dup 方法是标准的,该方法会为无法复制的类型引发 TypeError。因此任何对象都会“响应”它。您真的必须调用它并使用 begin-rescue-end 检查。

关于ruby - 如何检查变量是否真的 responds_to :dup?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20954789/

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