我正在寻找相当于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)
)
不,不是我所知道的.但你可以随时检查自己.
唯一类似的方法(顺便说一句: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)