2026-09-19
in_range.rs
fn in_range(x: i32, min: i32, max: i32) -> bool {
min < x < max
}
fn main() {
println!("{}", in_range(5, 0, 10));
}
min < x < maxで「xがminとmaxの間にあるか」を表したつもりですが、これはコンパイルできません。何が問題で、どう直せばよいでしょうか?
Answer
数学の不等式の見た目に引きずられてmin < x < maxと書きたくなりますが、Rustは比較演算子を連鎖させることを文法上許していません。<や>はジェネリクス(Vec<T>のような型引数)の区切りとしても使われるため、a < b < cのような並びを許すと「bを型引数リストの開始と読むか、比較演算子と読むか」が構文レベルで曖昧になってしまいます。この曖昧さを避けるため、Rustのコンパイラは比較演算子の連鎖そのものをエラーにしています(a < b < cのように書くと"comparison operators cannot be chained"というエラーになります)。2つの比較に分けて、&&で明示的につなげば直ります:
fn in_range(x: i32, min: i32, max: i32) -> bool {
min < x && x < max
}