Котлин: Применить против С

В чем разница между ними и их применением. Из того, что я знаю, следующий код делает то же самое:

swingElement.apply { minWidth = ENABLED_COLUMN_WIDTH maxWidth = ENABLED_COLUMN_WIDTH preferredWidth = ENABLED_COLUMN_WIDTH } with(swingElement) { minWidth = ENABLED_COLUMN_WIDTH maxWidth = ENABLED_COLUMN_WIDTH preferredWidth = ENABLED_COLUMN_WIDTH } 

Есть ли разница, и я должен использовать один над другим? Кроме того, есть ли случаи, когда один будет работать, а другой – нет?

Есть два отличия:

  1. apply принимает экземпляр в качестве получателя, а для этого требуется, чтобы экземпляр был передан в качестве аргумента. В обоих случаях экземпляр станет this в блоке.

  2. apply возвращает получателя и возвращает результат последнего выражения внутри своего блока.

Я не уверен, что могут быть какие-то строгие правила, по которым выбрать функцию. Обычно вы apply когда вам нужно что-то делать с объектом и возвращать его. И когда вам нужно выполнить некоторые операции над объектом и вернуть какой-то другой объект, вы можете использовать либо with либо run . Я предпочитаю run потому что это более читаемо, на мой взгляд, но это вопрос вкуса.