代码之家  ›  专栏  ›  技术社区  ›  outis

测试集合索引类型(即[]方法的参数)

  •  0
  • outis  · 技术社区  · 15 年前

    如果集合支持字符串索引,那么什么是一种有效的、鲁莽的测试方法?

    长版本: 我想让我的一个类规范化某些值。为了实现这一点,实例将值集合作为其“values”属性。我想 values= 接受列表(整数索引集合,包括内置数组)和关联数组(对象索引集合,如哈希)。如果传递一个列表,它将通过反转键和值将该列表转换为关联数组。这意味着该方法需要区分列表和关联数组。它还应该在任何索引集合上工作,而不仅仅是数组和哈希的后代,因此任何嗅探集合类型的类型都被认为是丑陋和错误的。但是,类型嗅探索引类型…

    目前,我使用异常来说明不同之处,但我更喜欢将异常用于异常情况,而不是一般的控制结构。这只是个人喜好,我不太喜欢。如果例外是解决这个问题的红宝石方法,请告诉我。

    def values=(values)
        begin
            values['']
            @values = values.dup
        rescue TypeError
            @values = Hash[ values.zip((0..values.length-1).to_a) ]
        end
        @values.each_value { |v| @values[v] = v}
    end
    

    注:完整的解决方案将采用 values 但是现在我可以假定 价值观 来自不同的域。

    所有这一切的重点是启用如下代码:

    toggle.values = [:off, :on]
    toggle.normalise(:off) == 0
    toggle.normalise(1) == 1
    
    bool.values = {:off => 0, :false => 0, :no => 0,
                   :on => 1,  :true => 1,  :yes => 1}
    bool.normalise(:yes) == 1
    bool.normalise(0) == 0
    

    这是一个私人项目,所以优雅和红宝石的方式是最重要的。我正在寻找有趣的方法,特别是如果它们能说明一个有趣的概念(例如“异常可以用作行为测试”)。

    1 回复  |  直到 15 年前
        1
  •  2
  •   rampion    15 年前

    鸭子打字来救援!

     hash = if collection.respond_to? :to_hash
              collection.to_hash
            elsif collection.respond_to? :to_ary
              collection.to_ary.inject({}) { |_hash,(key,value)| _hash.merge!(key => value) }
            else if collection.respond_to? :inject
              collection.inject({}) { |_hash,(key,value)| _hash.merge!(key => value) }
            else
              raise ArgumentError, "not a collection type I understand"
            end
     if want_dupe and collection.object_id == hash.object_id
        hash = hash.dup
     end