Namaran

Code daily. Without assist.

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で「xminmaxの間にあるか」を表したつもりですが、これはコンパイルできません。何が問題で、どう直せばよいでしょうか?

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
}