rust-ownership - 課題

概要

Rustの所有権システムを深く理解し、借用チェッカーと協調するコードを書く課題です。

マンダトリーパート

必須要件

  • 所有権の移動を理解する関数群
- 値の所有権を受け取り、変換して返す関数 - 所有権を消費して新しい値を生成する関数

  • 借用を活用したAPI設計
- 不変借用のみを使用する読み取り専用関数 - 可変借用を使用する変更関数

  • ライフタイムを明示した構造体
- 参照を保持する構造体 - 複数のライフタイムパラメータ

インターフェース

/// 所有権を受け取り、変換して返す
pub fn process_owned(data: String) -> String {
    // 実装
}

/// 借用を受け取り、新しい値を返す(所有権は移動しない)
pub fn process_borrowed(data: &str) -> String {
    // 実装
}

/// 可変借用で値を変更
pub fn modify_in_place(data: &mut String) {
    // 実装
}

/// 参照を保持する構造体
pub struct TextAnalyzer<'a> {
    text: &'a str,
}

impl<'a> TextAnalyzer<'a> {
    pub fn new(text: &'a str) -> Self {
        // 実装
    }

    pub fn word_count(&self) -> usize {
        // 実装
    }

    pub fn find_pattern(&self, pattern: &str) -> Vec<&'a str> {
        // 実装
    }
}

/// 複数ライフタイムを持つ構造体
pub struct Merger<'a, 'b> {
    left: &'a str,
    right: &'b str,
}

使用例

// 所有権の移動
let data = String::from("hello");
let processed = process_owned(data);
// data は使用不可

// 借用
let data = String::from("hello");
let result = process_borrowed(&data);
// data はまだ使用可能

// 可変借用
let mut data = String::from("hello");
modify_in_place(&mut data);

ボーナスパート

ボーナス1: カスタムイテレータ

  • ライフタイムを持つイテレータの実装

ボーナス2: 自己参照構造体

  • Pin と unsafe を使用した自己参照

ボーナス3: Cow(Clone on Write)

  • Cow<'a, str> を活用した効率的なAPI
  • 提出要件

  • src/ownership.rs - 所有権関連関数
  • src/borrowing.rs - 借用関連関数
  • src/lifetime.rs - ライフタイム構造体
  • src/main.rs - デモプログラム
  • Cargo.toml - 依存関係
  • 制限事項

  • unsafe は使用不可(ボーナス除く)
  • Rc, Arc, RefCell は使用不可
  • 外部クレートは使用不可