Я могу сместить объекты в NSMutableArray, не создавая временный массив?

Декоратора Python вызывают существенно другим способом в зависимости от того, даете ли Вы ему аргументы или нет. Художественное оформление на самом деле просто (синтаксически ограничено) выражение.

В Вашем первом примере:

@redirect_output("somewhere.log")
def foo():
    ....

функция redirect_output вызвана с данным аргументом, который, как ожидают, возвратит функцию декоратора, которая саму вызвана с foo как аргумент, который (наконец!), как ожидают, возвратит финал украшенная функция.

эквивалентный код похож на это:

def foo():
    ....
d = redirect_output("somewhere.log")
foo = d(foo)

эквивалентный код для Вашего второго примера похож:

def foo():
    ....
d = redirect_output
foo = d(foo)

, Таким образом, Вы можете делать то, что Вы хотели бы, но не полностью бесшовным способом:

import types
def redirect_output(arg):
    def decorator(file, f):
        def df(*args, **kwargs):
            print 'redirecting to ', file
            return f(*args, **kwargs)
        return df
    if type(arg) is types.FunctionType:
        return decorator(sys.stderr, arg)
    return lambda f: decorator(arg, f)

Это должно быть в порядке, если Вы не будете хотеть использовать функцию в качестве аргумента Вашему декоратору, в этом случае декоратор неправильно предположит, что это не имеет никаких аргументов. Это также перестанет работать, если это художественное оформление будет применено к другому художественному оформлению, которое не возвращает функциональный тип.

альтернативный метод должен только потребовать, чтобы функция декоратора всегда вызывалась, даже если это без аргументов. В этом случае Ваш второй пример был бы похож на это:

@redirect_output()
def foo():
    ....

код функции декоратора был бы похож на это:

def redirect_output(file = sys.stderr):
    def decorator(file, f):
        def df(*args, **kwargs):
            print 'redirecting to ', file
            return f(*args, **kwargs)
        return df
    return lambda f: decorator(file, f)
7
задан willc2 18 September 2009 в 11:12
поделиться

2 ответа

Попробуйте что-нибудь вроде

for (NSUInteger i = shift; i > 0; i--) {
   NSObject* obj = [mutableArray lastObject];
   [mutableArray insertObject:obj atIndex:0];
   [mutableArray removeLastObject];
}

CAVEAT - я не тестировал этот код, но это должно помочь вам решить проблему.

13
ответ дан 6 December 2019 в 12:53
поделиться

Вам нужно еще раз взглянуть на свой алгоритм. Каждый раз в цикле вы обмениваете один элемент (в случае shift = 1) со следующим.

0,1,2,3,4
1 , 0 ], 2,3,4
1, 2 , 0 , 3,4
1,2, 3 , 0 , 4
1,2,3, 4 , 0
0 , 2,3,4, 1

Вы можете выполнить операцию, которую хотите, но вам нужно подумать о том, как упорядочить шаги и их зависимости, чтобы получить правильный результат. В тривиальном случае вы можете просто работать в обратном направлении с конца.

0,1,2,3,4
4 , 1,2,3, 0
4,1 , 2, 0 , 3
4,1, 0 , 2 , 3
4, 0 , 1 , 2,3

3
ответ дан 6 December 2019 в 12:53
поделиться
Другие вопросы по тегам:

Похожие вопросы: