红宝石中的穿插功能?

mb1*_*b14 9 ruby

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

intersperse(nil, [1,2,3]) => [1,nil,2,nil,3,nil,4].
Run Code Online (Sandbox Code Playgroud)

我不是要求任何代码(我可以做到,我可能在你阅读这个问题之前已经完成了).我只是想知道标准Ruby平台上是否已经存在这样的功能.

更新

我不是要求任何代码,尤其是那些使用flatten的代码,因为它不起作用(flatten不仅平坦一个级别而且全部).我给出了示例[1,2,3]作为示例,但它应该可以使用

 [[1,2],[3,4]].interperse("hello") => [[1,2], "hello", [3,4]]
Run Code Online (Sandbox Code Playgroud)

(请不要向我发送任何代码以使其有效,我已经拥有它

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

)

Joh*_*ooy 9

没有

  • 添加一个句号会让答案过于冗长吗?:) (2认同)
  • 这是回答实际问题的唯一问题; 不是人们想到的问题.Upvoted.`join`可能是最接近的"主题". (2认同)

Jör*_*tag 6

不,不是我所知道的.但你可以随时检查自己.

唯一类似的方法(顺便说一句:Ruby是一种面向对象的语言,在Ruby中没有"函数"这样的东西)Array#join,它将元素映射到字符串并用分隔符对它们进行交织.Enumerable#intersperse基本上是对此的概括.

就像你说的那样,实现它是微不足道的,例如:

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

或这个:

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

然后,这将Array#join只是一个特例:

class Array
  def join(sep=$,)
    map(&:to_s).intersperse(s ||= sep.to_str).reduce('', :<<)
  end
end
Run Code Online (Sandbox Code Playgroud)

  • 我喜欢这个问题如何明确地表明*不*发布一个实现,并且*只*回答这个方法是否已经存在的问题,并且所有三个答案都忽略了请求,三分之二的人甚至没有回答这个问题: - ) (3认同)