Wątek przeniesiony 2021-08-05 08:08 z Inne języki programowania przez Adam Boduch.

Rust przenoszenie programów

0

Bawię się Rust i przeniosłem kody źródłowe w tym języku napisane w Intellij do drugiego systemu w którym jest PyCharm. IDE mają zainstalowaną wtyczkę Rust. Pod Intellij tworzyłem te programy w rustup i Rust w wersji 1.41, w drugim systemie na początku nie było rustup tylko samo cargo i rustc, a Rust w wersji 1.43. Ale niektóre programy pomimo swej prostoty nie chciały się już skompilować. Szybko odinstalowałem systemowe cargo i rustc i pobrałem już prawilnie rustup ze strony Rusta. Zaktualizowałem rustup update, ale nie wszystkie programy się kompilują. Teraz nie wiem czy to wina innego IDE, innej wersji Rust, cargo czy rustup?

use std::io;
use std::cmp::Ordering;
use rand::Rng;

pub fn run() {
    println!("Zgadnij numer!");

    let secret_number = rand::thread_rng().gen_range(1, 101);

    loop {
        println!("Podaj swoje domysły.");

        let mut guess = String::new();

        io::stdin().read_line(&mut guess)
            .expect("Nie można odczytać linii");

        let guess: u32 = match guess.trim().parse() {
            Ok(num) => num,
            Err(_) => continue,
        };

        println!("Zgadłeś: {}", guess);

        match guess.cmp(&secret_number) {
            Ordering::Less => println!("Za mały!"),
            Ordering::Greater => println!("Za duży!"),
            Ordering::Equal => {
                println!("Wygrałeś!");
                break;
            }
        }
    }
}
//mod hello;
//mod guess;
//mod value_printing;
//mod random_number;
mod game_numbers;
//mod variables;
//mod shadowing;
//mod floating_point_types;
//mod numeric_operations;
//mod the_boolean_type;
//mod the_character_type;
//mod the_tuple_type;
//mod the_array_type;
//mod functions;
//mod function_parametrs;
//mod expressions;
//mod functions_with_return_values;
//mod function;

fn main() {
    //hello::run();
    //guess::run();
    //value_printing::run();
    //random_number::run();
    game_numbers::run();
    //variables::run();
    //shadowing::run();
    //floating_point_types::run();
    //numeric_operations::run();
    //the_boolean_type::run();
    //the_character_type::run();
    //the_tuple_type::run();
    //the_array_type::run();
    //functions::run();
    //function_parametrs::run();
    //expressions::run();
    //functions_with_return_values::run();
    //function::run();
}
2

A jaki jest błąd całej tej sytuacji? Dobrze porozrzucałeś pliki w modułach?

1

Jaki otrzymujesz komunikat błędu?

Bez szczegółów nie można powiedzieć nic ponad "no zrobiłeś coś źle".

0

Wróciłem wcześniej do domu i sprawdziłem. A więc tak.

Zrobiłem nowy projekt w cargo, nazwałem go book. Struktura:

└── book
    ├── Cargo.lock
    ├── Cargo.toml
    ├── src
    │   ├── game_numbers
    │   └── main.rs
    └── target
        └── debug

Cargo.toml

[package]
name = "book"
version = "0.1.0"
authors = ["purrll <[email protected]>"]
edition = "2018"

# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html

# [dependencies]
# rand = "0.7.3"

[build-dependencies]
rand = "0.7.3"

mod.rs
Twoja wersja wyglądała tak:

use std::io;
use std::cmp::Ordering;
use rand::Rng;

Moja wygląda tak. Aczkolwiek obydwie wersje kompilują się za pomocą cargo.

extern crate rand;

use std::io;
use std::cmp::Ordering;
use rand::*;

pub fn run() {
    println!("Zgadnij numer!");

    let secret_number = rand::thread_rng().gen_range(1, 101);

    loop {
        println!("Podaj swoje domysły.");

        let mut guess = String::new();

        io::stdin().read_line(&mut guess)
            .expect("Nie można odczytać linii");

        let guess: u32 = match guess.trim().parse() {
            Ok(num) => num,
            Err(_) => continue,
        };

        println!("Zgadłeś: {}", guess);

        match guess.cmp(&secret_number) {
            Ordering::Less => println!("Za mały!"),
            Ordering::Greater => println!("Za duży!"),
            Ordering::Equal => {
                println!("Wygrałeś!");
                break;
            }
        }
    }
}

main.rs

mod game_numbers;

fn main() {
    game_numbers::run();
}

Cargo

$ cargo 1.39.0

rustc

rustc 1.42.0

Ja uruchamiam/kompiluje za pomocą cargo. Przez rustc nie mogę, bo dostaję:

 --> game_numbers/mod.rs:1:1
  |
1 | extern crate rand;
  | ^^^^^^^^^^^^^^^^^^ can't find crate

I właściwie nie wiem dlaczego. Nie korzystałem z rustc tylko zawsze z cargo, bo wygodniej. Myślałem, że pomoże dodanie do Cargo.toml:

[build-dependencies]
rand = "0.7.3"

Ale też nie. Jak przyjdzie mi do głowy jakiś pomysł to edytuję. Ale nie wcześniej jak wieczorem, bo teraz sprawdzałem na szybko.

Edit:
Już pamiętam. Żeby kompilować za pomocą rustc musisz pobrać crate i wskazać ścieżkę:

-L [KIND=]PATH      Add a directory to the library search path. The
                        optional KIND can be one of dependency, crate, native,
                        framework, or all (the default).
4

cargo oraz rustc to dwie odrębne aplikacje - rustc jest kompilatorem i nie obchodzi go Cargo.toml czy Cargo.lock (dlatego też te pliki dosłownie nazywają się Cargo.cośtam, a nie rustc.toml :-P).

cargo odpowiedzialne jest za pobranie paczek oraz przygotowanie środowiska (ścieżek) dla kompilatora tak, aby ten miał dostęp do całego kodu - dlatego suche wywołanie rustc na projekcie z zależnościami nie zadziała.

1 użytkowników online, w tym zalogowanych: 0, gości: 1