Я довольно новыми для Руст, так что я наткнулся на этот кусок кода в официальном Guideпеременные с тем же именем внутри некоторых (T) в Русте
let input = io::stdin().read_line()
.ok()
.expect("Failed to read line");
let input_num: Option<uint> = from_str(input.as_slice());
let num = match input_num {
Some(num) => num,
None => {
println!("Please input a number!");
return;
}
};
Хотя понять первые два заявления (на input
и inputnum
), я не совсем уверен в заявлении о матче. Поэтому я проверил documentation, который показывает, что Option<T>
может принимать два значения: None
или Some(T)
для некоторых (объект?) T
. Поэтому я тестировал следующий код:
io::println(
match input_num {
Some(num) => "somenum",
None => {
println!("Please input a number only!");
return;
}
}
);
Этот код работает должным образом; он печатает somenum
, если вы вводите номер, и в противном случае он печатает сообщение об ошибке. Однако компилятор дает предупреждение: warning: unused variable:
num , #[warn(unused_variable)] on by default
. Это подтвердило мои подозрения, что num
внутри `match используется как переменная.
Вопрос: Как это возможно, что rust
не жалуется (в примере на Гида в) имеющие две переменные с тем же именем num
? Или он «сдает» указатель на внутреннюю сторону num
снаружи num
? Также в случае пустого return
что именно возвращается? Я предполагаю, что это блок ()
, потому что он упоминается here что
функции без
-> ...
неявно имеют тип возвращаемого значения()
Edit: Извините за отсутствие очевидной точки. return
непосредственно выходит из функции, не утруждая себя чем-либо помещением в num
.
P.S. Я заметил, что использование cargo build
для компиляции не дает предупреждений во второй раз (не внося никаких изменений). Делает ли cargo
отслеживание версий или что-то еще?
За 9 месяцев программирования Java я не обнаружил ни одного примера затенения. Возможно, потому что это немного запутанно. Спасибо за ссылки и дополнительную информацию. – theindigamer
Хм, я обнаружил, что Java действительно намного менее разрешительна с затенением http://doanduyhai.wordpress.com/2012/07/07/variable-shadowing/ http://stackoverflow.com/questions/4623334/question-about-variable -scope-and-shadowing-in-java http://stackoverflow.com/questions/141140/why-does-java-not-have-block-scoped-variable-declarations Неудивительно, что у вас не было шансов встретиться Это. – nodakai
В Rust у вас есть образец соответствия и доктрина все-есть-выражение. Они подталкивают вас к примерам затенения имени. Java тоже нет, поэтому неудивительно, что вы не получаете столько затенения. –