Kotlin을 사용하는 Run, Let, App, Also 구분

12671 단어 Kotlin
※ 언제나 자신의 견해입니다.

개요


최근의 고민은 run,let,apply,also를 사용하는 것을 어떻게 구분하는가이다.
기본 기능은 공유하기 쉽다.run,let은 반환값을 기대하지 않습니다.apply,also는 같은 형식을 원합니다.
(이 부근의 사용 방법에 또 다른 보도가 많으니 사랑을 베는 것을 허락해 주십시오
문제는 그렇다면'run과 let'과'apply와also'의 차이는 무엇일까.
만약 모든 "let"을 설치할 수 있도록 노력한다면, "this와 it"의 의미를 알 수 없습니다!

공식 홈페이지 추천


먼저 공식 홈페이지를 보세요.
Are you calling methods on multiple objects in the block, or passing the instance of the context object as an argument? If you are, use one of the functions that allows you to access the context object as it, not this (also or let).
다른 값에 인용수로 전달할지 여부다.
예를 들어 아래의 예에서 "it"를 사용하는 것을 추천합니다.
이 방안에서'it'는 변화가 없고 일치성을 가지고 있다.

// Context object is 'it'
class Baz {
    var currentBar: Bar?
    val observable: Observable

    val foo = createBar().also {
        currentBar = it                    // Accessing property of Baz
        observable.registerCallback(it)    // Passing context object as argument
    }
}
또한 자신의 변경에 대해 "this"를 사용합니다.
따라서 기본적으로'this'가 나타날 때 작법이 좋지 않다고 생각할 수 있다.

// Context object is 'this'
class Baz {
    val foo: Bar = createBar().apply {
        color = RED    // Accessing only properties of Bar
        text = "Foo"
    }
}

어감으로 상상해 보세요.


사용법은 알겠지만 실제로 코드를 쓸 때는 잊어버리는 것 같아요.
그러니까 받아들이라고 상상해 보세요.
다음은 제 생각입니다. 참고만 하겠습니다.

Run


"내가 수행할게!"스스로 각양각색의 일을 하다.
그리고 그 결과는 아무도 원하지 않는다.
예: Toolbar 설정

var toolbar = findViewById<Toolbar>(R.id.toolbar)
toolbar.setNavigationIcon(R.drawable.icon)
toolbar.setNavigationOnClickListener(view -> doSomething())

//run
findViewById<Toolbar>(R.id.toolbar)
  .run {
    setNavigationIcon(R.drawable.icon)
    setNavigationOnClickListener({ doSomething() })
  }
같은 Object를 여러 번 실행하면 조금 편리할 뿐입니다.
아무 소용이 없을 거예요.

Let


"Let it be"처럼 이 아이를 다른 곳으로 보내라.
"자신에서 다른 사람으로"자신은 아무것도 변하지 않는다.
예: Intent를 전달하기 전에 비어 있는 check

val intent = getIntent()
if (intent != null) {
  setIntent(intent)
}

//let
getIntent()?.let { setIntent(it) }
는 지정된 번으로 전달된 매개변수의 Case입니다.
뭘 내고 싶을 때 "let"을 쓰면 돼요.

Apply


'나에게 적용', 자신에게 어떤 반영이 있는지.
자신에게 맡기기 전에 한 번 더 자신을 강화한다는 인상을 준다.
예: 프레임의 newInstance

fun newInstance(bundle: Bundle): FooFragment{
  var fragment = FooFragment()
  fragment.setArguments(bundle)
  return fragment
}

//apply
fun newInstance(bundle: Bundle): FooFragment{
  return FooFragment().apply {
    setArguments(bundle)
  }
}
같은 클래식 번들을 설정한 케이스입니다.
무엇을 반환하기 전에 Object 값을 구하고 싶을 때 사용하세요.

Also


겸사겸사이 값을 전달하기 전에 다른 값에 전달하십시오.
어떤 물건을 제출하기 전에 나도 다른 사람에게 보여줄 것이다д)
예: getInstance로 돌아가기

fun getInstance(context: Context): FooDatabase {
  if (INSTANCE != null) {
    return INSTANCE
  } else{
    INSTANCE = buildDatabase(context)
    return INSTANCE
  }
}

//also
fun getInstance(context: Context): FooDatabase {
  if (INSTANCE != null){
    return INSTANCE
  } else{
    return buildDatabase(context).also { INSTANCE = it }
  }
}

//もっと省略
fun getInstance(context: Context): FooDatabase {
  return INSTANCE ?: buildDatabase(context).also { INSTANCE = it } |
}
다른 애들한테 보여주고 싶을 때도 써.
공식에 따르면 특히'it'를 사용하고 싶지 않을 때도 사용할 수 있다.
예를 들면 LOG.info("Something created") 같은 Log 계열입니다.

다른 사람의 생각


그리고 우리의 생각도 재미있다.
Example of when should we use run, let, apply, also and with on Kotlin (stackoverflow)

복잡해질 때


복잡할 때는 억지로 Scope Function 하나로 쓰지 않아도 된다.
체인이 가능하니까 여러 개로 해결하세요.
getIntent()
  .let { intent ->
   sendIntent(intent.setData(data)) //itを弄らない
  }

getIntent()
  .apply {
    setData(fooData)
  }.let {
    sendIntent(it)
  }

끝내다


코드는 움직일 뿐만 아니라 느낄 수 있습니다.
예쁜 코드 같이 써주세요.

참고 자료

  • Kotlin 공식 홈페이지
  • Example of when should we use run, let, apply, also and with on Kotlin (stackoverflow)
  • googlesamples (github)
  • 업데이트: 예가 추가되었습니다.(06/14)

    좋은 웹페이지 즐겨찾기