вкрапленная функция в рубине? - PullRequest
9 голосов
/ 09 сентября 2010

Я ищу эквивалент функции instersperse haskell в Ruby.По сути, это добавляет что-то (например, разделитель) между каждым элементом списка.

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

Я не прошу какой-либо код (я могу сделать это, и я, вероятно, сделал бы это прежде, чем вы прочитаетевопрос).Мне просто интересно, существует ли такая функция на стандартной платформе Ruby.

update

Я не спрашиваю никакого кода, особенно кода, использующего flatten, так как этого не происходитработа (сглаживает не только плоский уровень, но и все).Я привел пример [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 ]

9 голосов
/ 09 сентября 2010

Нет

6 голосов
/ 09 сентября 2010

Нет, не то, что я знаю. Но вы всегда можете проверить себя .

Единственный похожий метод (кстати, Ruby является объектно-ориентированным языком, в Ruby нет такой вещи, как «функция») - это 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

Что тогда сделало бы Array#join просто особым случаем:

class Array
  def join(sep=$,)
    map(&:to_s).intersperse(s ||= sep.to_str).reduce('', :<<)
  end
end
2 голосов
/ 09 сентября 2010

Похоже на zip ...

Может быть что-то вроде этого:

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]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...