Keyboard shortcuts

Press or to navigate between chapters

Press S or / to search in the book

Press ? to show this help

Press Esc to hide this help

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 找到。