rust vs zig
От: Разраб  
Дата: 15.09.23 03:29
Оценка:
От нечего делать потыкал вчера оба.
1. на удивление легко под убунтой настроил отладку в vs code
rustc 1.72.0 (5680fa18f 2023-08-23)
zig 0.12.0-dev.374+742030a8f
В расте удивило, что модуль в проекте не просто файл и даже не скоуп(mod Name {}), а его еще нужно в главном файле
определить
mod Name;
и только потом юзать Name::func1();
Тут проще как будто зиг. просто const mod = @import("mod.zig");
_ = mod.func1();
Ну да ладно, а дальше интересно. просто решил вынести readln в отдельную функцию.
//utils.rs
use std::io;

pub fn readln(prompt: &str) -> String {
    println!("{}", prompt);
    let mut input = String::new();
    _ = io::stdin().read_line(&mut input);
    return String::from(&input[..input.len() - 1]);// <- небольшой оверхед по-моему, ведь метод называется read_line ;-)
}

//main.rs
mod utils;// <- вот это мне показалось совсем не очевидно

struct Person {
    name: String,
}

fn main() {
    let name = utils::readln("What is your name?");
    let person = Person {
        name: String::from(name),
    };
    println!("Привет, {}!", person.name);
}

//utils.zig
const std = @import("std");
pub fn readln(prompt: []const u8) ![]u8 {

    var gpa = std.heap.GeneralPurposeAllocator(.{}){};
    defer _ = gpa.deinit();
    const allocator = gpa.allocator();

    const stdin = std.io.getStdIn();
    std.debug.print("{s}", .{ prompt });
    var input = std.ArrayList(u8).init(allocator);
    defer input.deinit();

    try stdin.reader().streamUntilDelimiter(input.writer(), '\n', 1024);
    
    return input.items;
}
//main.zig
const std = @import("std");
const utils = @import("utils.zig");

const Person = struct  {
    name : []u8
 };

pub fn main() !void {
    var name = try utils.readln("What is your name?\n");
    //defer name;
    var person = Person { .name = name};
    std.debug.print("Hello, {!}!", .{person});
}


Собирается, но кидает ошибку в рантайме

Hello, main.Person{ .name = { Segmentation fault at address 0x7f793c7b7000
/snap/zig/8746/lib/std/fmt.zig:662:29: 0x264ce6 in formatType__anon_8745 (zello)
for (value, 0..) |elem, i| {

Не смог найти хорошего примера именно функции для зиг, в то же время в раст как докуметация, так и помощь компилятора на высоте.
Или все же зарыться в си++ и не парится? Модульный вариант выглядит вполне съедобно. Конечно не так вкусно как зиг, но все же.
☭ ✊ В мире нет ничего, кроме движущейся материи.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.