面试题答案
一键面试逻辑与(&&)和逻辑或(||)的短路特性示例
-
逻辑与(&&)短路特性: 在Rust中,逻辑与(&&)运算符具有短路特性。当使用
&&
连接两个表达式时,如果第一个表达式的值为false
,那么第二个表达式将不会被求值。 示例代码如下:fn main() { let a = false; let b = expensive_function(); let result = a && b; println!("Result: {}", result); } fn expensive_function() -> bool { println!("Expensive function called!"); true }
在上述代码中,由于
a
为false
,expensive_function
不会被调用,这就是逻辑与的短路特性。 -
逻辑或(||)短路特性: 逻辑或(||)运算符也有短路特性。当使用
||
连接两个表达式时,如果第一个表达式的值为true
,那么第二个表达式将不会被求值。 示例代码如下:fn main() { let a = true; let b = expensive_function(); let result = a || b; println!("Result: {}", result); } fn expensive_function() -> bool { println!("Expensive function called!"); true }
这里因为
a
为true
,expensive_function
不会被调用,体现了逻辑或的短路特性。
实际编程中利用短路特性优化代码的场景
-
条件判断优化: 当有多个条件需要判断,且某些条件的判断开销较大时,可以利用短路特性。例如,在检查用户输入时,可能需要先检查输入是否为空,然后再进行更复杂的格式验证。
fn validate_user_input(input: &str) -> bool { // 先检查是否为空,空字符串不需要复杂验证 if input.is_empty() { return false; } // 复杂的格式验证 //... true }
可以简化为:
fn validate_user_input(input: &str) -> bool { // 利用短路特性 !input.is_empty() && complex_format_validation(input) } fn complex_format_validation(input: &str) -> bool { // 复杂的格式验证逻辑 true }
这样如果输入为空,就不会执行复杂的格式验证函数。
-
资源安全检查: 在操作某些资源(如文件、网络连接等)前,可能需要进行一系列的前置条件检查。利用短路特性可以避免在条件不满足时不必要的资源操作。
use std::fs::File; use std::io::Write; fn write_to_file(file_path: &str, content: &str) -> Result<(), std::io::Error> { // 先检查文件路径是否有效,避免无效路径尝试打开文件 if file_path.is_empty() { return Err(std::io::Error::new(std::io::ErrorKind::InvalidInput, "Empty file path")); } let mut file = File::create(file_path)?; file.write_all(content.as_bytes())?; Ok(()) }
可以优化为:
use std::fs::File; use std::io::Write; fn write_to_file(file_path: &str, content: &str) -> Result<(), std::io::Error> { if!file_path.is_empty() { let mut file = File::create(file_path)?; file.write_all(content.as_bytes())?; Ok(()) } else { Err(std::io::Error::new(std::io::ErrorKind::InvalidInput, "Empty file path")) } }
或者更简洁地:
use std::fs::File; use std::io::Write; fn write_to_file(file_path: &str, content: &str) -> Result<(), std::io::Error> { (!file_path.is_empty() && File::create(file_path) .map(|mut file| file.write_all(content.as_bytes()))) .map_err(|e| std::io::Error::new(std::io::ErrorKind::InvalidInput, e.to_string())) }
这样在文件路径无效时,不会尝试创建文件,提高了代码的安全性和效率。