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}`


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

★★

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

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

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

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

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

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

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

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

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

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

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

playX ★★
() автор топика
Последнее исправление: playX (всего исправлений: 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

Смотри, если поискать 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

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

anonymous
()
Ответ на: комментарий от 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 ★★★★★
()

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

Virtuos86 ★★★★★
()

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

WatchCat ★★★★★
()
Ответ на: комментарий от 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)
Ответ на: комментарий от 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
()
Ответ на: комментарий от playX

питон такого сделать не мог, там строгая типизация

MyTrooName ★★★★★
()

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

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 ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.