Вы можете определить общий удобный метод , который возвращает срезы массива на основе условия (предиката).
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]
The above article does refer to this but I'll post it for clarity: http://viewsourcecode.org/why/hacking/seeingMetaclassesClearly.html
Если вы готовы потратить немного денег, тогда на сайте Pragmatic Programmers есть отличная серия скринкастов по объектной модели Ruby и метапрограммированию. Это не очень дорого и это очень всеобъемлющая серия, которая охватывает много крутых вещей и стоит каждого цента.
Мне нужно посмотреть его снова, чтобы попытаться разобраться в некоторых концепциях, тогда я могу быть одним из классная мета толпа :)
Вот хорошее введение в метапрограммирование ruby: http://practicalruby.blogspot.com/2007/02/ruby-metaprogramming-introduction.html
Вот хороший обзор: http://ola-bini.blogspot.com/2006/09/ruby-metaprogramming-techniques.html