LINUX.ORG.RU

Нужна помощь в Rust

 ,


0

4

Ковыряю раст, сделал вот такую штуку:

 fn main(){
	let mut age = String::new();
    if age < 14 {
		println!("Ты не подросток,твой возраст {}", age);
	}
	else if age >= 14 {
		println!("Ты подросток,твой возраст {}", age);
	}
	else {
		println!("Неизвестное число");
	}
}

Но при компиляции выдает ошибку:
 error[E0308]: mismatched types
 --> RustLang.rs:5:14
  |
5 |     if age < 14 {
  |              ^^ expected struct `std::string::String`, found integral variable
  |
  = note: expected type `std::string::String`
             found type `{integer}`


Те кто знает раст, может объясните ЧЯДНТ?

★★

Rust здесь не причем. Ты пытаешься сравнить строку с числом, это бессмысленно.

tailgunner ★★★★★ ()
Ответ на: комментарий от tailgunner

А как в таком случае сделать age числом?В документации к расту только String::new видел

playX ★★ ()
Ответ на: комментарий от playX

в Go для этого есть функция strconv.Atoi()

anonymous ()
Ответ на: комментарий от playX

Ну в твоем примере там вообще пустая строка. А так вообще читай доку

let age = String::from("16");
let age: u32 = age.parse().unwrap();

Результат метода parse — либо число типа T либо ошибка. unwrap уронит программу, если в строке не число, скорее всего ты захочешь прочекать эту ошибку и попросить пользователя ввести верное число.

По этому поводу читать тут.

mersinvald ★★★★★ ()

И еще чуть чуть прикопаюсь: что за неизвестное число такое?)

mersinvald ★★★★★ ()
Ответ на: комментарий от mersinvald

Подразумевается что будет писать это когда будут слова вместо чисел,просто не правильно сформулировал.

Спасибо за помощь

playX ★★ ()
Последнее исправление: playX (всего исправлений: 1)
Ответ на: комментарий от playX

На этом моменте у тебя parse упадет, тебе надо проверять его ошибку, если ввели не число

mersinvald ★★★★★ ()
Последнее исправление: mersinvald (всего исправлений: 1)
Ответ на: комментарий от mersinvald

Вот что теперь вышло:

error[E0277]: the trait bound `std::string::String: std::convert::From<{integer}>` is not satisfied
 --> source_file.rs:5:13
  |
5 | 		let age = String::from(16);
  | 		          ^^^^^^^^^^^^ the trait `std::convert::From<{integer}>` is not implemented for `std::string::String`
  |
  = help: the following implementations were found:
            <std::string::String as std::convert::From<&'a str>>
            <std::string::String as std::convert::From<std::borrow::Cow<'a, str>>>
  = note: required by `std::convert::From::from`

error: aborting due to previous error

playX ★★ ()
Ответ на: комментарий от playX

let age = String::from(16);
Как ты думаешь, что именно должна делать эта строка?

quantum-troll ★★★★★ ()
Ответ на: комментарий от quantum-troll

Как то не догадываюсь,но предполагаю что должна из другой строки брать число 16?

playX ★★ ()
Последнее исправление: playX (всего исправлений: 1)
Ответ на: комментарий от playX

Смотри, если поискать https://doc.rust-lang.org/stable/std/?search=String::From находишь https://doc.rust-lang.org/stable/std/string/struct.String.html#method.from From — трейт (типаж), если щелкнуть по нему, откроется https://doc.rust-lang.org/stable/std/convert/trait.From.html На этой странице написано, что T: From<U> позволяет преобразовывать значения типа U в значения типа T.

Вопрос: зачем ты пытаешься преобразовать число 16 в строку?

quantum-troll ★★★★★ ()

Давай ты сформулируешь, что именно ты хочешь сделать, а я покажу как и объясню построчно.

quantum-troll ★★★★★ ()
Ответ на: комментарий от quantum-troll

Наверняка прочитать строку из stdin и перевести в число. Непонятно только, чем дефолтная книжка по расту не угодила, где этот (ну почти) пример разбирается «построчно».

anonymous ()

вот что javascript с людьми делает

MyTrooName ★★★★★ ()
Ответ на: комментарий от MyTrooName

Никогда не видел код на javascript,со мной это питон сделал

quantum-troll мне надо что бы можно было ввести число и затем сравнить его с другим числом

playX ★★ ()

А для чего else { println!( «Неизвестное число» ); }? На всякий пожарный?

anonymous ()
Ответ на: комментарий от playX
fn main() {
    use std::io::stdin;
    
    let mut input = String::new();
    
    println!("Enter your age");
    
    // TODO: handle errors
    stdin().read_line(&mut input).unwrap();
    let age: u32 = input.parse().unwrap();
    
    if age >= 13 && age <= 19 {
        println!("You are a teenager, your age is {}", age);
    } else {
        println!("You aren't a teenager, you age is {}", age);
    }
}
theNamelessOne ★★★★★ ()

Я бы таки посоветовал для начала прочитать книгу, буквально во второй главе рассматривается похожая программа.

Singularity ★★★★ ()
Ответ на: комментарий от playX

со мной это питон сделал

Странно, в питоне же тоже нельзя сравнивать числа со строками.

theNamelessOne ★★★★★ ()

Не хочется тебя расстраивать, но ты слишком туп для раста. Бросай эту затею. Пока не начнешь понимать, что такое «тип» в языках программирования, что такое «строгая типизация» даже не суйся в изучение компилируемых языков.

Virtuos86 ★★★★★ ()

Автор пришёл с пэхапэ или js?
Это там можно строки с числами сравнивать и неполучать ошибок ни во время компиляции ни во время исполнения.

WatchCat ★★★★★ ()
Ответ на: комментарий от Virtuos86

Илитизм такой илитизм.

Товарищу достаточно изучить книгу, там эти вещи подробно объясняются.

mersinvald ★★★★★ ()
Ответ на: комментарий от theNamelessOne

Можно сделать так:

age = input()
if age < 14
  print("Something")
elif age >= 14 
  print("Something")

И это будет работать

Virtuos86 Ну надо же с какого то компилируемого языка начинать? Бросать учить раст не намерен.

mersinvald Я пока до второй книги не дошел, эту программу сделал что бы попробовать написать что-то свое, и еще String::new() рассматривался в 1 книге в главе 4.1 «Угадайка», вот и решил попробовать такой хелло ворлд сделать. Что ж если во второй главе все рассматривается подробно, то изучу и ее сразу после изучения 1 главы.

playX ★★ ()
Последнее исправление: playX (всего исправлений: 1)

Так же что бы не плодить темы спрошу здесь, есть ли книги по rust'у наподобие книги «Изучаем Java»?

playX ★★ ()
Ответ на: комментарий от theNamelessOne

Нужен trim, read_line не удаляет символ конца строки.

    let age: u32 = input.trim().parse().unwrap();
red75prim ★★ ()
Ответ на: комментарий от mersinvald

Какой в опу «илитизм»?

изучить книгу

Ага, удачи. Ждем серию тредов «я по-прежнему не понимаю, что такое типы, и почему конпелятор беспощадно лупит меня по рукам; владение?? что это еще такое?!».

Virtuos86 ★★★★★ ()
Ответ на: комментарий от playX

String::new() создаёт новую строку (изменяемую, с владением). read_line читает ввод и пишет в строку по ссылке. parse берёт срез строки, и возвращает Result<число, ошибка>. unwrap разворачивает его в просто число. А число можно уже непосредственно сравнивать с другими числами.

quantum-troll ★★★★★ ()
Ответ на: комментарий от playX

есть ли книги по rust'у наподобие книги «Изучаем Java»

Вроде нету. Но зато есть очень годные доки.
Одно только вдумчивое использование https://doc.rust-lang.org/std/ способно многое прояснить.

quantum-troll ★★★★★ ()
Ответ на: комментарий от playX

Можно сделать так:

Это не валидный код.

Virtuos86 Ну надо же с какого то компилируемого языка начинать? Бросать учить раст не намерен.

Ты хочешь научиться плавать и бросаешься в океан без спасательного круга. А правильно будет записаться в секцию в бассейн. И, кстати, ты уже тонешь.

Virtuos86 ★★★★★ ()
Последнее исправление: Virtuos86 (всего исправлений: 1)
Ответ на: комментарий от Virtuos86

Да, ладно тебе! Может быть, автору лет 14 всего. Тогда вполне под силу ему изучить

dave ★★★★★ ()
Ответ на: комментарий от playX

Тогда дерзай дальше! Rust - очень интересный язык программирования. Но про C и Java тоже не забудь!

dave ★★★★★ ()
Ответ на: комментарий от playX

На офф сайте, который rust-lang.org заходишь в раздел документация. И там найдешь все актуальное и прекрасно оформленное. Серьезно, я не видел документации лучше.

Aswed ★★★★★ ()
Ответ на: комментарий от playX

Можно сделать так: ...
И это будет работать

Сделать можно, но работать это не будет:

>>> "14" < 14
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: '<' not supported between instances of 'str' and 'int'

Можешь попробовать начать с этой статьи про системы типов: https://habrahabr.ru/post/161205/

Вот выдержка про «твою ошибку»:

Сильная / слабая типизация (также иногда говорят строгая / нестрогая). Сильная типизация выделяется тем, что язык не позволяет смешивать в выражениях различные типы и не выполняет автоматические неявные преобразования, например нельзя вычесть из строки множество. Языки со слабой типизацией выполняют множество неявных преобразований автоматически, даже если может произойти потеря точности или преобразование неоднозначно.

Примеры:
Сильная: Java, Python, Haskell, Lisp;
Слабая: C, JavaScript, Visual Basic, PHP.

anonymous ()

А что, хаскель не вкатил? Не факт что с сабжем будет проще.

anonymous ()
Ответ на: комментарий от playX

Можно сделать так:

...

И это будет работать

Скорее всего потому, что ты использовал второй питон, в котором input вычисляет (eval) пользовательский ввод, т.е. позволяет пользователю выполнить произвольный питонокод, что не очень хорошо, согласись. Поэтому во втором питоне используют raw_input вместо input.

В третьем питоне такой код уже работать не будет.

theNamelessOne ★★★★★ ()
Ответ на: комментарий от Virtuos86

Если книгу читать, а не пролистывать, то там всё довольно подробно разжевывается.

До кучи можно пролистать K&R.

mersinvald ★★★★★ ()

Посмотрел я на трейтсы в расте и понял, что раст - абсолютно убогое подобие хаскеля. Пытались повторить, а получилось как шаблоны в С++, там надо через зад, а так вообще нельзя, а эдак компилятор вообще не пропарсил. Мало того заюзали эту всю эту хрень в стандартной либе, что теперь даже итератор нормально не отнаследуешь. Lifetimes конечно идея прикольная, но можно и без них прожить, если GC не брезговать.

q0tw4 ★★★★ ()
Ответ на: комментарий от q0tw4

Да, да, проходи мимо, не задерживайся, наше мнение очень важно для вас (с)

mersinvald ★★★★★ ()
Ответ на: комментарий от q0tw4

Мало того заюзали эту всю эту хрень в стандартной либе, что теперь даже итератор нормально не отнаследуешь.

Зачем тебе «отнаследовать» итератор?

DarkEld3r ★★★★★ ()

= note: expected type `std::string::String`
found type `{integer}`

В первую очередь выучи английский, тогда программирование будет проще даваться. Вот как здесь, компилятор для тебя на чистом английском сделали подробнейшее пояснение.

foror ★★★★ ()
Ответ на: комментарий от dave

Но про C и Java тоже не забудь!

В 2018 году в 14 лет? Нет спасибо, человек сделал очень правильный выбор. На его месте и в это же время сделал бы точно также.

foror ★★★★ ()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.