【问题标题】:How do I know if an object can be duplicated?我如何知道一个对象是否可以复制?
【发布时间】:2015-01-28 10:20:57
【问题描述】:

我正在实现一个类的to_a 方法,我希望所有可以 被复制的对象(如String)都被复制,同时保留其他类型(如@987654328) @ 和 Integer) 单独。首先我认为这很简单:

if object.respond_to? :dup
  object.dup
else
  object
end

事实证明,所有对象都响应:dup,但整数和符号会引发类型错误。我可以这样做:

begin
  object.dup
rescue TypeError
  object
end

但我想避免对控制流使用异常。


有没有办法检查一个对象是否可以在不依赖异常的情况下被复制?

我正在使用 Ruby 2.0.0

【问题讨论】:

  • @Surya:将其添加到问题中,对不起
  • @Surya:是的,#respond_to?所有 对象返回 true。那就是问题所在。 #dup 引发整数和符号类型错误。
  • 我确定您已经遇到过this。那个人也有同样的想法。我想你可以创建一个助手,但无论如何它仍然会使用异常处理。
  • 我应该滚动further down。看起来像 Rails(特别是 ActiveSupport gem),添加了一个方法 duplicable? 方法。添加那个宝石是否可行?
  • @PaulRichter 似乎 Rails 对其进行了硬编码。 api.rubyonrails.org/files/activesupport/lib/active_support/… @Hubro 您可以要求您的类/模块的用户实现 2/3 方法:duplicable?dup/clone(已定义)。

标签: ruby


【解决方案1】:

无法给您一个好的答复,但这是我尝试要求 ruby​​ 核心团队添加功能的示例(除非其他人找到一种简单的方法来确定对象是否可以复制或不是)。

考虑到除了 BasicObject 之外的所有对象都继承自 Object 类,这不应该是一个大的补充。

所以也许这是 .duplicatable 的情况?可以直接添加到核心中。

bugs.ruby-lang.org/projects/ruby-trunk

【讨论】:

  • 这应该是一条评论。
【解决方案2】:

如果您还没有冻结obj,那么(无论如何在Ruby 2 中)我相信obj.frozen?true 当且仅当obj 不可复制,我相信这是true 当且仅当obj 是不可变的;例如:

1.frozen?     #=> true
:a.frozen?    #=> true
'cat'.frozen? #=> false

另一种检查obj 是否可复制的方法是(即使obj 已被冻结)我认为是查看obj.class.respond_to? :new 是否为true

1.class.respond_to? :new     #=> false
:a.class.respond_to? :new    #=> false
'cat'.class.respond_to? :new #=> true

我邀请读者“证明”这些猜想,或反驳它们(例如,用反例)。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-11-30
    • 1970-01-01
    • 2020-09-30
    • 2015-01-27
    • 2021-09-29
    • 1970-01-01
    • 2021-11-05
    • 1970-01-01
    相关资源
    最近更新 更多