目录
- 下面是对 Rust、Java、Kotlin 中与 ? 运算符相关语法的系统整合与对比,涵盖其含义、用法、典型示例和语义差异,帮助你从跨语言的视角深入理解:
- 🔍 ? 运算符在三种语言中的角色一览
- 🧠 Rust 中的 ? 运算符
- ✅ 功能
- ✅ 示例
- 🧠 Kotlin 中的 ? 系列操作符
- 1. ?. 安全调用(null-safe access)
- 2. ?: Elvis 操作符(默认值)
- 3. !! 强制非 null(可能抛异常)
- 🧠 Java 中无 ? 运算符,但手动空值判断
- 手动处理 null:
- 或用 Optional(Java 8+):
- 🔁 关键用法对照表
- 🔎 更深层次对比(语义 & 编译器)
- 🧪 示例对照(解析并加上手续费)
- ✅ Rust
- ✅ Kotlin
- ✅ Java
- 📌 总结
下面是对 Rust、Java、Kotlin 中与 ? 运算符相关语法的系统整合与对比,涵盖其含义、用法、典型示例和语义差异,帮助你从跨语言的视角深入理解:#
🔍 ? 运算符在三种语言中的角色一览#
🧠 Rust 中的 ? 运算符#
✅ 功能#
- 用于
Result 或 Option 类型解包
- 如果是
Err 或 None,立即返回当前函数的错误
- 本质是简洁的错误传播机制
✅ 示例#
fn parse_number(s: &str) -> Result<i32, std::num::ParseIntError> {
let num = s.parse::<i32>()?; // 自动传播错误
Ok(num + 1)
}
等价于:
let num = match s.parse::<i32>() {
Ok(n) => n,
Err(e) => return Err(e),
};
🧠 Kotlin 中的 ? 系列操作符#
1. ?. 安全调用(null-safe access)#
val name: String? = getUserName()
val length = name?.length // 如果为 null,则结果是 null
2. ?: Elvis 操作符(默认值)#
val length = name?.length ?: 0 // name 为 null 时返回 0
3. !! 强制非 null(可能抛异常)#
val length = name!!.length // 如果 name 为 null,则 NPE
🧠 Java 中无 ? 运算符,但手动空值判断#
手动处理 null:#
String name = getName();
int length = name != null ? name.length() : 0;
或用 Optional(Java 8+):#
Optional<String> name = Optional.ofNullable(getName());
int length = name.map(String::length).orElse(0);
🔁 关键用法对照表#
🔎 更深层次对比(语义 & 编译器)#
🧪 示例对照(解析并加上手续费)#
✅ Rust#
fn total_cost(s: &str) -> Result<i32, std::num::ParseIntError> {
let qty = s.parse::<i32>()?; // 自动传播错误
Ok(qty * 5 + 1)
}
✅ Kotlin#
fun totalCost(s: String): Int? {
val qty = s.toIntOrNull() ?: return null
return qty * 5 + 1
}
✅ Java#
public Integer totalCost(String s) {
try {
int qty = Integer.parseInt(s);
return qty * 5 + 1;
} catch (NumberFormatException e) {
return null;
}
}
📌 总结#