Keyboard shortcuts

Press ← or → to navigate between chapters

Press S or / to search in the book

Press ? to show this help

Press Esc to hide this help

Различные представления

// Copyright 2026 Google LLC
// SPDX-License-Identifier: Apache-2.0

fn main() {
    let c_repr = b"Hello, C\0";
    let cc_repr = (b"Hello, C++\0", 10u32);
    let rust_repr = (b"Hello, Rust", 11);
}

Каждый язык по-своему решает, как что-то реализовать, что может приводить к путанице и ошибкам. Рассмотрим три способа представить текст.

Покажите, как преобразовать сырые представления в строковый срез Rust:

// Copyright 2026 Google LLC
// SPDX-License-Identifier: Apache-2.0

// Представление C → Rust
unsafe {
    let ptr = c_repr.as_ptr() as *const i8;
    let c: &str = std::ffi::CStr::from_ptr(ptr).to_str().unwrap();
    println!("{c}");
};

// Представление C++ → Rust 
unsafe {
    let ptr = cc_repr.0.as_ptr();
    let bytes = std::slice::from_raw_parts(ptr, cc_repr.1);
    let cc: &str = std::str::from_utf8_unchecked(bytes);
    println!("{cc}");
};

// Представление Rust (байты) → строковый срез
unsafe {
    let ptr = rust_repr.0.as_ptr();
    let bytes = std::slice::from_raw_parts(ptr, rust_repr.1);
    let rust: &str = std::str::from_utf8_unchecked(bytes);
    println!("{rust}");
};

Замечание: в Rust есть строковый литерал с префиксом c. Он добавляет нулевой байт в конец, например c"Rust" == b"Rust\0".