代码之家  ›  专栏  ›  技术社区  ›  Daniel Beardsley

Ruby:Object.to_替换

  •  26
  • Daniel Beardsley  · 技术社区  · 16 年前

    我需要将传入的参数(单个对象或集合)转换为数组。我不知道这个论点是什么。如果它已经是一个数组,我想离开它,否则从它创建一个单元素数组。我在找你 兼得 method(:objs => obj) method(:objs => [obj1, obj2])

    这似乎是最好的方法(数组返回自我):

    arg = arg.to_a
    

    Object#to_a 很快就会过时 . 有方便的更换吗?

    还有比这更简洁的吗?

    arg = arg.respond_to?(:to_a) ? arg.to_a : [arg]
    
    7 回复  |  直到 13 年前
        1
  •  45
  •   Grant Hutchins    16 年前

    使用该方法 Kernel#Array :

    Array([1,2,3]) #=> [1, 2, 3]
    Array(123) #=> [123]
    

        2
  •  9
  •   Michael Kohl    13 年前

    哇,有人刚刚给一根很旧的线施了巫术-O但是由于我还没有看到它包含在内,为了完整起见,我将再添加一种方法:

    arg = [*arg]
    

    如果参数已经是一个数组(从而删除一级嵌套),这将显示该参数,否则将创建一个单参数数组:

    arg = [1,2,3]
    [*arg] #=> [1, 2, 3]
    arg = 1
    [*arg] #=> [1]
    
        3
  •  2
  •   Jonathan Lonowski    16 年前

    Object.to_a 已弃用,正在删除默认值 to_a 以及强制每个类定义自己的类(例如。, Hash.to_a

    self.to_a       #=> -:1: warning: default `to_a' will be obsolete
    "hello".to_a    #=> ["hello"]
    Time.new.to_a   #=> [39, 54, 8, 9, 4, 2003, 3, 99, true, "CDT"]
    
    h = { "c" => 300, "a" => 100, "d" => 400, "c" => 300  }
    h.to_a   #=> [["a", 100], ["c", 300], ["d", 400]]
    

    Object ,请尝试:

    Hash.new(obj).to_a
    

    如果是这种情况,请尝试:

    obj = [obj] if !obj.is_a?(Array)
    
        4
  •  2
  •   krusty.ar    16 年前

    [:[], :each, :etc...].all? { |m| obj.respond_to? m } ? obj : [obj]
    

    优点是,您可以让对象有机会实现其自己的索引访问语义。

        5
  •  2
  •   glenn mcdonald    16 年前

    我经常这样做,并且总是使用:

    arg = [arg] unless arg.is_a?(Array)
    

    不过,如果您知道您从未将数组作为单独的参数传入,您也可以这样做:

    arg = [arg].flatten
    
        6
  •  1
  •   theschmitzer    16 年前

    我不确定这是否有帮助,但我经常需要的不是arg是一个数组,而是arg响应每个数组。

    arg = [arg] unless arg.respond_to? :each
    
        7
  •  0
  •   Keltia    16 年前