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>を活用した効率的なAPIsrc/ownership.rs- 所有権関連関数src/borrowing.rs- 借用関連関数src/lifetime.rs- ライフタイム構造体src/main.rs- デモプログラムCargo.toml- 依存関係unsafeは使用不可(ボーナス除く)Rc,Arc,RefCellは使用不可- 外部クレートは使用不可