Как я могу распечатать подпункты именованного аргумента с помощью println!()?

#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");
}