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

ruby中的穿插函数?

  •  9
  • mb14  · 技术社区  · 14 年前

    我在寻找Ruby中haskell instersperse函数的等价物。基本上,在列表的每个元素之间添加一些东西(比如分隔符)。

    intersperse(nil, [1,2,3]) => [1,nil,2,nil,3,nil,4].
    

    更新

    我举了一个例子[1,2,3]作为例子,但它应该适用于

     [[1,2],[3,4]].interperse("hello") => [[1,2], "hello", [3,4]]
    

    (请不要给我发任何代码来让它工作,我已经有了

    class Array
      def intersperse(separator)
        (inject([]) { |a,v|  a+[v,separator] })[0...-1]
      end
    end
    

    )

    3 回复  |  直到 14 年前
        1
  •  9
  •   John La Rooy    14 年前

        2
  •  7
  •   Jörg W Mittag    14 年前

    不,据我所知不是。但你可以一直 check yourself .

    Array#join ,它将元素映射到字符串并用分隔符解释它们。 Enumerable#intersperse 基本上就是一个概括。

    就像你说的,实现起来很简单,例如:

    module Enumerable
      def intersperse(obj=nil)
        map {|el| [obj, el] }.flatten(1).drop(1)
      end
    end
    

    module Enumerable
      def intersperse(obj=nil)
        drop(1).reduce([first]) {|res, el| res << obj << el }
      end
    end
    

    这就意味着 数组#连接 只是一个特例:

    class Array
      def join(sep=$,)
        map(&:to_s).intersperse(s ||= sep.to_str).reduce('', :<<)
      end
    end
    
        3
  •  2
  •   Mark Thomas    9 年前

    可能是这样的:

    class Array
      def intersperse(item)
        self.zip([item] * self.size).flatten[0...-1]
      end
    end
    

    用法:

    [1,2,3].intersperse(nil) #=> [1, nil, 2, nil, 3]