Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Ownership of Swift as seen from iteration and Rust

Ownership of Swift as seen from iteration and Rust

Takuma Shimizu

February 15, 2019
Tweet

More Decks by Takuma Shimizu

Other Decks in Programming

Transcript

  1. Ownership Manifesto 所有権に関する提案や考察 実装の優先順位 ABI Dashboard > Ownership 排他則 (

    排他アクセス) co-routine 一部だけ; read / modify アクセッサ向け? __shared / __owned 引数 apple/swift のmaster ブランチにて確認
  2. Ownership Manifesto > Explicit tools for ownership > for loops

    ( 未実装) 今後、仕様が変わることもあります。
  3. 不変イテレーション for shared employee in company.employees { if !employee.respected {

    throw CatastrophicHRFailure() } } イテレーションの中で要素を変更しない イテレーション変数は要素への 共有(shared) 参照 要素の取り出しにコピーが発生しない Collection に対するnonmutating な操作 Collection protocol に準拠していれば shared の明示的な宣言は不要
  4. 可変イテレーション for inout employee in company.employees { employee.respected = true

    } イテレーションの中で要素を変更可能 イテレーション変数は要素への 可変(inout) 参照 要素の取り出しにコピーが発生しない MutableCollection に対するmutating な操作
  5. Rust における共有参照・可変参照 共有参照 let mut prime_nums = vec![2, 3, 5,

    7]; let prime_ref: &vec<i32> = &prime_nums; // cannot borrow `prime_nums` as mutable // because it is also borrowed as immutable prime_nums.remove(0); dbg!(prime_ref); dbg!(prime_nums); 共有参照としての借用が終わるまで 可変操作( 借用) ができない 参照中に元の値が変更されないことを保証 安全
  6. Rust における共有参照・可変参照 可変参照 let mut prime_nums = vec![2, 3, 5,

    7]; let prime_ref = &mut prime_nums; // cannot borrow `prime_nums` as immutable // because it is also borrowed as mutable println!("{:?}", prime_nums); println!("{:?}", prime_ref); 可変参照としての借用が終わるまで 別の借用( 共有参照すら) ができない 変更中の値が使われないことを保証 安全
  7. 消費イテレーション for owned employee in company.employees { newCompany.employees.append(employee) } いつものイテレーション

    ( owned の明示は不要) イテレーション変数は要素を owned( 所有) する Sequence protocol に対するconsuming ( 消費) 操作
  8. 消費イテレーション イテレーション変数は要素を owned( 所有) する non-copyable 型 ( 未実装) から要素の所有権を得る

    Sequence protocol 破壊的な消費をしながらのイテレーション 1 度目とそれ以降のイテレーションが同じ結果にな るとは限らない 2 度目以降のイテレーションは未定義動作
  9. Rust における消費イテレーション let prime_nums = vec![2, 3, 5, 7]; for

    prime in prime_nums { println!("{:?}", prime); } // borrow of moved value: `prime_nums` println!("{:?}", prime_nums.is_empty()); 未定義動作どころか未初期化状態になり コンパイルが通らない prime_nums 変数そのものがmove( 移動) する