Rust VS JavaScript:控制流

48 阅读2分钟

本文简单比较了 Rust 与 JavaScript 在控制流的差异:

  • if

  • 循环控制流:forwhile

if

Rust 示例

fn main() {
    let number = 3;

    if number < 5 {
        println!("condition was true");
    } else {
        println!("condition was false");
    }
}

JavaScript 示例

const main = () => {
  let number = 3;

  if (number < 5) {
    console.log("condition was true");
  } else {
    console.log("condition was false");
  }
};

不同点

  • Rust 中的 if 的条件必须是 bool 值,不像 Ruby 或 JavaScript 这样的语言,Rust 并不会尝试自动地将非布尔值转换为布尔值。必须总是显式地使用布尔值作为 if 的条件。

  • Rust 中的 if 是表达式。如下是一个示例:

fn main() {
    let number = 3;

    let result = if number < 5 {
        "condition was true"
    } else {
        "condition was false"
    };

    println!("{}", result);
}

  • JavaScript 中 if 的条件必须由括号包裹。

循环

for

Rust 示例

fn main() {
    let a = [10, 20, 30, 40, 50];

    for element in a {
        println!("the value is: {element}");
    }
}

JavaScript 示例

const main = () => {
  let a = [10, 20, 30, 40, 50];

  for (const element of a) {
    console.log(`the value is: ${element}`);
  }
};

不同点:

  • Rust 中的 for 是表达式。

  • JavaScript 中的 for..of 语句,必须由括号包裹

while

Rust 示例:

fn main() {
    let mut number = 3;

    while number != 0 {
        println!("{number}!");

        number -= 1;
    }

    println!("LIFTOFF!!!");
}

JavaScript 示例:

const main = () => {
  let number = 3;

  while (number != 0) {
    console.log(`${number}!`);

    number -= 1;
  }

  console.log("LIFTOFF!");
};

不同点:

  • Rust 中的 while 是表达式。

  • JavaScript 中 while 的条件必须由括号包裹。

loop

Rust 示例

fn main() {
    let mut counter = 0;

    loop {
        counter += 1;

        if counter == 10 {
            break;
        }
    }
}

同时 loop 是表达式,支持从循环返回值:

fn main() {
    let mut counter = 0;

    let result = loop {
        counter += 1;

        if counter == 10 {
            break counter * 2;
        }
    };

    println!("{}", result);
}

JavaScript 示例

JavaScript 中并没有 loop,不过可以使用 while 实现逻辑相同的代码,示例如下:

const main = () => {
  let counter = 0;

  while (true) {
    counter += 1;

    if (counter == 10) {
      break;
    }
  }
};

循环标签

如果存在嵌套循环,breakcontinue 应用于此时最内层的循环。我们可以选择在一个循环上指定一个 循环标签,然后将标签与 breakcontinue 一起使用,使这些关键字应用于已标记的循环而不是最内层的循环。

Rust 示例

fn main() {
    let mut count = 0;
    'counting_up: loop {
        println!("count = {count}");

        let mut remaining = 10;
        loop {
            println!("remaining = {remaining}");

            if remaining == 9 {
                break;
            }
            if count == 2 {
                break 'counting_up;
            }
            remaining -= 1;
        }

        count += 1;
    }
    println!("End count = {count}");
}

JavaScript 示例

const main = () => {
  let count = 0;
  counting_up: while (true) {
    console.log(`count = ${count}`);

    let remaining = 10;
    while (true) {
      console.log(`remaining = ${remaining}`);

      if (remaining == 9) {
        break;
      }
      if (count == 2) {
        break counting_up;
      }
      remaining -= 1;
    }

    count += 1;
  }
  console.log(`End count = ${count}`);
};

main();

不同点:

  • Rust 中循环标签前有一个反引号,而 JavaScript 中没有。

总结

Rust 和 JavaScript 在控制流的主要差异:

  • Rust 中的控制流为表达式。

  • JavaScript 中控制流的条件表达式必须用括号包裹。