Не Нулевой ярлык в Delphi

1120 Я думаю, что логика ваших двух вложенных циклов в корне неверна. В настоящее время это работает так:

for x in first_iterable:
    for y in second_iterable:
        if x != y:
            do_something(x)

Попробуйте это с парой range в качестве итерируемых элементов, и я думаю, вы увидите, что это не делает то, что вы хотите. Вызов do_something(x) будет происходить каждый раз, когда значения x и y не совпадают, возможно, много раз для каждого x.

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

for x in first_iterable:
    if x not in second_iterable:
        do_something(x)

Другой способ написания теста not in - использовать all(x != y for y in second_iterable) (что будет удобнее для более сложных тестов, чем простое неравенство) , Этот код будет проверять все значения в second_iterable перед запуском do_something(x), а не делать это многократно, если есть много несоответствующих пар.

Чтобы выразить это в терминах вашего текущего кода (обрезать избыточные переменные, связанные с заголовком, до одной и дать ему лучшее имя):

for submission in source.new(limit=50):
    crosspost_title = submission.title + " (by X)"
    if all(crosspost_title != other.title for other in subreddit.new(limit=200)):
        ...

Обратите внимание, что это может сделать ваш код более эффективно, если вы перемещаете проверку ваших ключевых слов (например, "string1"), прежде чем вы убедитесь, что сообщение еще не было перекрестно размещено. Я бы предложил использовать any для этого теста, а не целую кучу тестов if с идентичным кодом в них (if any(keyword in title for keyword in ["string1", "string2", ...]):).

7
задан Peter Turner 29 September 2008 в 16:09
поделиться

4 ответа

Как knight_killer, на который указывают выше, Вы используете Assert() функция, утверждая это Assigned(obj) true. Конечно, как на наиболее скомпилированных языках, утверждения не выполнены (или даже включены в выход компилятора), если Вы конкретно не включили им, таким образом, Вы не должны полагаться на утверждения для сборок режима выпуска.

Можно, конечно, просто проверить по nil, а-ля Assert(obj <> nil). Однако Assigned() производит тот же самый выход компилятора и обладает дополнительным преимуществом, что это работает над указателями на методы класса также (которые являются в действительности парой указателей, одного к методу и другого одного к экземпляру класса), таким образом с помощью Assigned() хорошая привычка состоит в том, чтобы взять.

14
ответ дан 6 December 2019 в 05:39
поделиться

Не уверенный, что Вы имеете в виду, но Assert(Assigned(MyObject)); довольно коротко и прост в использовании.

10
ответ дан 6 December 2019 в 05:39
поделиться

Присвоенный (AObject) скажет Вам, если объект будет нолем или нет.

Возможно, стоящий упоминания то, это, если Вы освобождаете объект с помощью AObject. Освободите Присвоенный, все еще возвратит true. Поэтому удостоверьтесь, что Вы освобождаете использование объекта FreeAndNil (AObject).

7
ответ дан 6 December 2019 в 05:39
поделиться

если Присвоено (MyObject) затем...

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

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