in
关键字
in
关键字用于测试一个值是否在一个范围内。
// InKeyword/MembershipInRange.kt
fun main() {
val percent = 35
println(percent in 1..100)
}
/* 输出:
true
*/
在 布尔类型 中,你学会了显式检查边界:
// InKeyword/MembershipUsingBounds.kt
fun main() {
val percent = 35
println(0 <= percent && percent <= 100)
}
/* 输出:
true
*/
0 <= x && x <= 100
在逻辑上等同于 x in 0..100
。IntelliJ IDEA 建议自动将第一种形式替换为第二种形式,因为第二种形式更易于阅读和理解。
in
关键字用于迭代和成员关系检查。在 for
循环的控制表达式中的 in
表示迭代,否则 in
用于成员关系检查:
// InKeyword/IterationVsMembership.kt
fun main() {
val values = 1..3
for (v in values) {
println("iteration $v")
}
val v = 2
if (v in values)
println("$v is a member of $values")
}
/* 输出:
iteration 1
iteration 2
iteration 3
2 is a member of 1..3
*/
in
关键字不限于范围。你还可以检查一个字符是否是一个 String
的一部分。以下示例使用 in
替代了前面一篇文章中的 hasChar()
函数:
// InKeyword/InString.kt
fun main() {
println('t' in "kotlin")
println('a' in "kotlin")
}
/* 输出:
true
false
*/
在本书后面,你会看到 in
也适用于其他类型。
在这里,in
测试一个字符是否属于一个字符范围:
// InKeyword/CharRange.kt
fun isDigit(ch: Char) = ch in '0'..'9'
fun notDigit(ch: Char) =
ch !in '0'..'9' // [1]
fun main() {
println(isDigit('a'))
println(isDigit('5'))
println(notDigit('z'))
}
/* 输出:
false
true
true
*/
- [1]
!in
用于检查值是否不属于一个范围。
你可以创建一个 Double
范围,但只能用它来检查成员关系:
// InKeyword/FloatingPointRange.kt
fun inFloatRange(n: Double) {
val r = 1.0..10.0
println("$n in $r? ${n in r}")
}
fun main() {
inFloatRange(0.999999)
inFloatRange(5.0)
inFloatRange(10.0)
inFloatRange(10.0000001)
}
/* 输出:
0.999999 in 1.0..10.0? false
5.0 in 1.0..10.0? true
10.0 in 1.0..10.0? true
10.0000001 in 1.0..10.0? false
*/
浮点数范围只能使用 ..
创建,因为 until
意味着排除一个浮点数作为端点,这是没有意义的。
你可以检查一个 String
是否属于一组 String
的范围:
// InKeyword/StringRange.kt
fun main() {
println("ab" in "aa".."az")
println("ba" in "aa".."az")
}
/* 输出:
true
false
*/
这里 Kotlin 使用字母比较。
练习和解答可在 www.AtomicKotlin.com 找到。