Вы просто не всегда хотите работать с приемниками. Например, если учесть, что ваша filter
работала с элементами напрямую, вам нужно использовать в сравнении квалификатор this
:
val filtered = listOf("foo", "bar").filter2 {
this == "f"
}
Это выглядит странно и неестественно. На что указывает this
?
Вы изменили область действия this
, чтобы указать на приемник, и если вы хотите получить доступ к «внешнему» this
, это будет выглядеть так:
this@SomeClass.c =="f"
Еще одним недостатком является то, что вы теряете возможность называть свой параметр. Подумайте, например, о вложенных лямбдах. Тогда ни it
, ни this
не подходит. Вы должны были бы дать пользовательские имена.
Вы всегда должны учитывать, действительно ли вы хотите переключиться на приёмник. Некоторые ситуации идеально подходят для использования, особенно DSL . Для обычных функций более высокого порядка вы просто не хотите иметь эту функцию.
Я думаю, что трудно сформулировать «правило» для этого, но для начала вы можете прочитать, что JetBrains рекомендует о том, как выбирать доступные функции области видимости (let
, run
, also
apply
with
):
Вы вызываете методы для нескольких объектов в блоке или передаете экземпляр объекта контекста в качестве аргумента? Если вы, используйте одну из функций, которая позволяет вам получить доступ к объекту контекста, как он, а не это (также или пусть). Используйте также, если приемник вообще не используется в блоке.