首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Ruby 1.9内嵌器

Ruby 1.9内嵌器
EN

Code Review用户
提问于 2013-12-01 22:31:41
回答 1查看 101关注 0票数 3

我目前正在以番石榴的Interner风格实现一个内部人员,其中:

  1. 为不可变类维护实习生池。
  2. 每当创建该类的新实例时,都会检查它是否等于实习生池中的现有实例
  3. 如果找到这样一个现有实例,则返回该实例,否则新实例将添加到池中并返回

当然,在Ruby中,您可以替换new[]这样的方法,所以我的实现就是这样做的:

代码语言:javascript
复制
module Interner
  def self.extended(obj)
    intern_pool = Hash.new do |hash, key|
      # Ideally, this should be a deep freeze, but it's not supported
      # (see http://bugs.ruby-lang.org/issues/show/2509).
      if key.respond_to?(:clone)
        key = key.clone
        key.freeze if key.respond_to?(:freeze)
      end
      hash[key] = key
    end
    [:new, :[]].each do |name|
      if obj.respond_to?(name)
        obj.singleton_class.module_exec(obj.method(name)) do |orig|
          define_method name do |*args, &block|
            intern_pool[orig[*args, &block]]
          end
        end
      end
    end
  end
end

示例用法:

代码语言:javascript
复制
Foo = Struct.new :foo, :bar do
  extend Interner
end

a = Foo[1, 2]
b = Foo[3, 4]
c = Foo.new(1, 2)
d = Foo.new(3, 4)
a.equal?(c)  # => true
b.equal?(d)  # => true

我意识到我的实现并不完美。你能推荐哪些改进措施?

EN

回答 1

Code Review用户

发布于 2014-01-06 17:20:43

我看不出什么我会改变的。这是一个很好的概念,做得很好。我不会改变太多。首先是小事。

我会考虑将参数名从Interner.extendedobj更改为klass

作为“很多小方法”粉丝俱乐部的一员,我认为:

代码语言:javascript
复制
  def self.extended(klass)
    intern_pool = make_intern_pool
    ...
  end

  def self.make_intern_pool
    Hash.new do |hash, key|
      key = freeze_key(key)
      hash[key] = key
    end
  end

  def self.freeze_key(key)
    # Ideally, this should be a deep freeze, but it's not supported
    # (see http://bugs.ruby-lang.org/issues/show/2509).
    if key.respond_to?(:clone)
      key = key.clone
      key.freeze if key.respond_to?(:freeze)
    end
    key
  end

现在,谈一些更重要的事情。内部人员提出了一个合理的假设,即new是一种工厂方法。然而,假设[]是一种工厂方法是不太合理的。当然,Struct也是如此,也许其他许多类也是如此,但不一定总是如此。我更希望找到一种方法来明确工厂方法的名称(S),这样我就可以控制哪些方法由内部人员包装。仍然应该有一种简单、默认的方法来使用封装new的内部器,但是也许还有另一种方法可以让您指定要包装的方法。

票数 2
EN
页面原文内容由Code Review提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://codereview.stackexchange.com/questions/36470

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档