CompactMap на sequence () не ленивый?

https://github.com/suryashekhawat/pythonExamples/blob/master/string_toggle.py

    def toggle(mystr):
        arr = []
        for char in mystr:
            if char.upper() != char:
                char=char.upper()
                arr.append(char)
            else:
                char=char.lower()
                arr.append(char)
        return ''.join(map(str,arr))
    user_input = raw_input()
    output = toggle(user_input)
    print output

2
задан matt 27 June 2019 в 01:02
поделиться

1 ответ

Проблема не compactMap по сути. Существует две проблемы:

  1. , Если Вы хотите, чтобы последовательность звонила compactMap лениво, необходимо использовать lazy .

  2. казалось бы, что first предотвращает ленивое поведение. Если Вы используете first(where:), тем не менее, Вы действительно наслаждаетесь ленивым поведением.

Таким образом, в то время как несколько неэлегантный, следующее достигает что поиск you’re:

if let vc = (chain.lazy.compactMap { [110] as? ViewController }.first { _ in true } ) {
    ...
} 

Или, как Вы говорите, можно реализовать first (или lazyFirst) на [1 110]:

extension Sequence {
    var first: Element? {
        return first { _ in true }
    }
}

И затем это более упрощенное представление теперь все еще лениво:

if let vc = chain.lazy.compactMap({ [112] as? ViewController }).first {
    ...
} 
1
ответ дан Rob 27 June 2019 в 01:02
поделиться
  • 1
    Моя любимая часть об этом ответе - то, что они непреднамеренно записали допустимую строку Python. – ArtOfWarfare 23 January 2016 в 22:31
Другие вопросы по тегам:

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