TIL

아이템 2 변수의 스코프를 최소화하라

val a = 1

fun fizz() {
	val b = 2
	print(a + b)
}

val buzz = {
	val c = 3
	print(a + c)
}

// 여기선 a를 사용할 수 있지만, b, c는 사용 불가

for ((i, user) in users.withIndex()) { // 스코프를 좁게 가져가는 좋은 예
	// ...
}
val user: User = if (hasValue) getValue() else User()
fun updateWeather(degrees: Int) {
	val (description, color) = when {
		degrees < 5 -> "cold" to Color.BLUE
		degrees < 23 -> "mild" to Color.YELLOW
		else -> "hot" to Color.RED
	}
}

캡처링

var numbers = (2..100).toList()
val primes = mutableListOf<Int>
while (numbers.isNotEmpty()) {
	val prime = numbers.first()
	primes.add(prime)
	numbers = numbers.filter { it % prime != 0 }
}

print(primes.take(10).toList()) // [2, 3, 5, 7, 11, 13, 17, 19, 23, 29]
val primes: Sequence<Int> = sequence {
	val numbers = generateSequence(2) { it + 1 }
	
	var prime: Int
	while (true) {
		prime = numbers.first()
		yield(prime)
		numbers = numbers.drop(1)
			.filter { it % prime != 0 }
	}
}

print(primes.take(10).toList()) // [2, 3, 5, 6, 7, 8, 9, 10, 11, 12]
val primes: Sequence<Int> = sequence {
	val numbers = generateSequence(2) { it + 1 }
	
	while (true) {
		val prime = numbers.first()
		yield(prime)
		numbers = numbers.drop(1)
			.filter { it % prime != 0 }
	}
}