
■ with の便利な使い方 (公式)
public inline fun <T, R> with(receiver: T, block: T.() -> R): R {
  contract {...}
  return receiver.block()
}
with is a non-extension function that can access members of its argument concisely: you can omit the instance name when referring to its members.
with は非拡張関数で、引数のメンバに簡潔にアクセスできる。メンバを参照する際にインスタンス名を省略できる。
Grouping function calls on an object
オブジェクトの関数呼び出しをグループ化する。
Call multiple methods on an object instance (with)
オブジェクトのインスタンスに対して複数のメソッドを呼び出す。
👉 Kotlin Examples: Learn Kotlin Programming By Example 
👉 Scope functions | Kotlin 
👉 Idioms | Kotlin 
■ まとめ
「with」は「記述の長い View などの連続操作をまとめる」のに多く使わています。
with(binding) {
  progressBar.visibility = View.VISIBLE
  cancelButton.visibility = View.VISIBLE
  goButton.visibility = View.GONE
  seeFileButton.visibility = View.GONE
}
with(viewBinding.recyclerView) {
  setHasFixedSize(true)
  adapter = ProductSearchAdapter()
  layoutManager =
    LinearLayoutManager(
      this@ProductSearchActivity,
      LinearLayoutManager.VERTICAL,
      false
    )
}
with(holder.binding) {
  person = items[position]
  executePendingBindings()
}
with の戻り値を使わないことのほうが多く見えますが、戻り値はあります。
val windowDpSize = with(LocalDensity.current) {
  windowSize.toDpSize()
}
👉 Kotlin スコープ関数 の上手な使い分け その1 - apply 
👉 Kotlin スコープ関数 の上手な使い分け その2 - also 
👉 Kotlin スコープ関数 の上手な使い分け その3 - with 
👉 Kotlin スコープ関数 の上手な使い分け その4 - let 
👉 Kotlin スコープ関数 の上手な使い分け その5 - run