Метапрограммирование Ruby [закрытое] учебное руководство онлайн

Вы можете определить общий удобный метод , который возвращает срезы массива на основе условия (предиката).

def slice_when(predicate, iterable):
  i, x, size = 0, 0, len(iterable)
  while i < size-1:
    if predicate(iterable[i], iterable[i+1]):
      yield iterable[x:i+1] 
      x = i + 1
    i += 1
  yield iterable[x:size] 


Теперь, срез должен быть сделан, когда следующий элемент меньше предыдущего, например:

array = [5, 7, 10, 2, 7, 8, 1, 3]
slices = slice_when(lambda x,y: x > y, array)
print(list(slices))
#=> [[5, 7, 10], [2, 7, 8], [1, 3]]

Так что вы можете использовать его так же просто, как :

res = []
for e in slice_when(lambda x,y: x > y, array):
  res.extend(e[::-1] )

res #=> [10, 7, 5, 8, 7, 2, 3, 1]
28
задан Robin Barnes 20 August 2013 в 12:47
поделиться

4 ответа

The above article does refer to this but I'll post it for clarity: http://viewsourcecode.org/why/hacking/seeingMetaclassesClearly.html

24
ответ дан 28 November 2019 в 03:01
поделиться

Если вы готовы потратить немного денег, тогда на сайте Pragmatic Programmers есть отличная серия скринкастов по объектной модели Ruby и метапрограммированию. Это не очень дорого и это очень всеобъемлющая серия, которая охватывает много крутых вещей и стоит каждого цента.

Мне нужно посмотреть его снова, чтобы попытаться разобраться в некоторых концепциях, тогда я могу быть одним из классная мета толпа :)

7
ответ дан 28 November 2019 в 03:01
поделиться

Вот хорошее введение в метапрограммирование ruby: http://practicalruby.blogspot.com/2007/02/ruby-metaprogramming-introduction.html

5
ответ дан 28 November 2019 в 03:01
поделиться
2
ответ дан 28 November 2019 в 03:01
поделиться