EnumとSend

RustのenumがSend,Syncを実装するには?

enumは代数的データ型でいうsum type(和型…?)で、そのvariantのいずれにもなりうる。enumがSendであるためには、そのvariant(のstructやtupleの要素)がすべてSendでなければならない。

以下の例ではRcを送るとエラーになることを示す。RcSend, Syncでない理由はRcはSend, Syncではないを参照。

use std::sync::mpsc::*;
use std::rc::Rc; // Rc: !Send, !Sync

#[derive(Debug)]
enum Animal {
    Dog,
    Cat {
        color: Rc<()>,
    },
    Human
}

fn main() {
    let (tx, rx) = channel();
    
    std::thread::spawn(move || {
        tx.send(Animal::Cat{color: Rc::new(())}).unwrap();
        
        // This also errors
        //tx.send(Animal::Dog).unwrap();
    });
    
    let val = rx.recv();
    println!("Received {:?}", val);
}

Backlinks

There are no notes linking to this note.