#rust #println
#Ржавчина #println
Вопрос:
Я узнал об использовании именованных аргументов при печати, например, так:
fn main() {
println!("{nombre} le gusta el {actividad}",
nombre= {"Clemente";"Roberto"}, actividad= "futbol");
}
Я не могу понять, как вывести «Роберто» вместо «Клементе». Есть ли какой-либо способ получить доступ к подпунктам? Скажем:
{nombre[1]}
Комментарии:
1. 1) Ваш текущий код выполняет то, что вы просите — play.rust-lang.org /… . 2) Ваш именованный аргумент является блоком, поэтому каждый элемент, кроме предыдущего, теряется после его выполнения.
2. Я выполнил последний сохраненный запуск, извините за это. Но есть ли какой-либо способ выбрать между X именами, имеющими упорядоченный подпункт, настолько приблизительный, насколько я написал?
3. В чем причина того, чтобы просто не использовать
Vec
?4. Хорошо, это на 100% не по теме, но просто из любопытства… Я плохо говорю по-испански, но я бы сказал «Клементе ле густа эль футбол». Слышать «Clemente» без «a» звучит неправильно. Это ошибка?
5. @trentcl Оба верны, с «a» вы используете его при разговоре с кем-либо. Без него это оператор.
Ответ №1:
{"Clemente";"Roberto"}
является блочным выражением, а не каким-либо объектом или значением. Это означает, что все, что находится между открытыми и закрытыми завитушками, оценивается как отдельный оператор. Это то же самое, что
fn main() {
let s = {
"Clemente";
"Roberto" // the return value
}; // s is set to "Roberto"
println!("{nombre} le gusta el {actividad}",
nombre=s, actividad= "futbol");
}
поэтому, когда println!
вычисляет аргументы формата, он получает только возвращенные, "Roberto"
так что это то, что печатается. Все остальное в этом блоке теряется, если только значение из внешней области не было изменено.
Если бы вы хотели сохранить два имени в коллекции и распечатать одно или другое с использованием индексов, вам нужно было бы определить коллекцию и проиндексировать это: ["Clemente", "Roberto"][0]
. Вы не можете индексировать именованный аргумент внутри строки форматирования (например, println!({nombre[0]} ...
), потому что на самом деле это просто имя, которое заменяется связанным значением.
fn main() {
println!("{nombre} le gusta el {actividad}",
nombre=["Clemente", "Roberto"][0], actividad="futbol");
}
Еще лучше, определите коллекцию перед println!
, чтобы ее было легче читать и поддерживать позже! Это не обязательно просто предложение, и обычно считается наилучшей практикой.
fn main() {
let nombres = ["Clemente", "Roberto"]];
println!("{nombre} le gusta el {actividad}",
nombre=nombres[0], actividad="futbol");
}