Как вернуть значение внутри для l oop в ржавчине? - PullRequest
2 голосов
/ 07 февраля 2020

Я хочу перенести этот python код

#!/usr/bin/python
# -*- coding: utf-8 -*-

def testing(x, y):
    for i in range(y):
        x = 2.0 * x
        if x > 3.5:
            return i
    return 999


for i in range(20):
    print testing(float(i) / 10, 15)

и его вывод

999
5
4
3
3
2
2
2
etc.

на код ржавчины. Это код ржавчины, который я написал, который идентичен приведенному выше коду python.

fn testing(x: f32, y: i32) -> i32 {
    for i in 0..y {
        let x = 2.0 * x;
        if x > 3.5 {
            return i;
        }
    }
    return 999;
}

fn main() {
    for i in 0..20 {
        let a = i as f32;
        println!("{}", testing(a / 10.0, 15));
    }
}

Но его вывод не совпадает с выводом python кодов

999
999
999
999
999
999
999
etc.

Как правильно вернуть значение для l oop с помощью ржавчины? Почему мой код ржавчины выводит другой вывод по сравнению с питонами?

1 Ответ

6 голосов
/ 07 февраля 2020

Проблема в том, что строка

let x = 2.0 * x;

let вводит новую переменную, исходная x не изменяется. Следующая итерация l oop будет снова умножена на 2.0 с параметром x, а не с переменной x из предыдущей итерации l oop.

Вместо этого вам нужно присвоить значение к существующей переменной x (которая требует пометить ее как mut способны):

fn testing(mut x: f32, y: i32) -> i32 {
    for i in 0..y {
        x = 2.0 * x;
        if x > 3.5 {
            return i;
        }
    }
    return 999;
}

fn main() {
    for i in 0..20 {
        let a = i as f32;
        println!("{}", testing(a / 10.0, 15));
    }
}
...