1
resposta

Qual seria de fato a melhor forma de obter o resultado?

Eu gostaria de entender qual seria o problema de fazer isso aqui:

fun main() {

    with(Endereco()){
        logradouro = "Rua Vergueiro"
        numero = 7700
        bairro = "São Miguel Pta."
        cidade = "São Paulo"
        estado = "SP"
        cep = "08080-880"
        complemento = "Apartamento"
        completo()
    }.let(::println)
}

Ao invés de:

fun main() {

    with(Endereco()){
        logradouro = "Rua Vergueiro"
        numero = 7700
        bairro = "São Miguel Pta."
        cidade = "São Paulo"
        estado = "SP"
        cep = "08080-880"
        complemento = "Apartamento"
        completo()
    }.let{ enderecoCompleto: String ->
        println(enderecoCompleto)
    }
}

Tendo em vista que não estou criando variáveis para passar como parâmetro no objeto de contexto, pois com o with o objeto é passado como argumento funcionando como um receiver mas o retorno é pela lambda. Gostaria de entender esse ponto.

1 resposta

Olá Giovanni!

A diferença entre as duas formas de utilizar o with está na forma como você está tratando o retorno da lambda.

Na primeira forma, você está utilizando o let para imprimir o resultado da função completo() que está sendo chamada dentro do with. O let é uma função de escopo que recebe o resultado do with como argumento e permite que você faça alguma operação com esse resultado. Nesse caso, você está imprimindo o valor retornado pela função completo().

Na segunda forma, você está utilizando uma lambda anônima para receber o resultado do with e imprimir diretamente. Essa lambda recebe o resultado do with como parâmetro e você pode nomear esse parâmetro como quiser. No exemplo, foi utilizado o nome enderecoCompleto.

As duas formas estão corretas e funcionam da mesma maneira. A escolha entre uma ou outra vai depender da sua preferência pessoal e do contexto em que você está trabalhando.

Espero ter ajudado e bons estudos!