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