Могу ли я определить черту, реализация которой должна быть `! Send`? - PullRequest
0 голосов
/ 23 мая 2018

Я бы хотел определить черту, которая ни при каких обстоятельствах не заставляет его разработчиков отправлять потоки или делиться ими между потоками.Достаточно отметить черту как !Send, но Rust, кажется, не позволяет мне.

Возможно ли это?

Пример ( детская площадка ):

#![feature(optin_builtin_traits)]

// This is a syntax error
//trait ThreadThing : !Send {}

// This doesn't work either
trait ThreadThing { }
impl !Send for ThreadThing {}

Ответы [ 2 ]

0 голосов
/ 24 мая 2018

Нет, вы не можете сделать !Send условием ThreadThing.Компилятор просто не поддерживает такую ​​логику.

Если кто-то может использовать ваш ящик, может создать тип, который неявно Send, не содержит небезопасного кода вего реализация где угодно, и делает его небезопасным , просто внедрив для него ThreadThing - в этом случае вы бы сделали ThreadThing unsafe trait, чтобы указать, что это небезопасногде-то код, основанный на инварианте, который не может быть описан в системе типов: инвариант «Вещи, которые Send не реализуют ThreadThing».

Если, как более вероятно, этоРеализовать Send вручную только для типа, который реализует ThreadThing, небезопасно - в этом случае вам не нужно ничего делать, потому что реализация Send вручную уже небезопасна .Если разработчик ThreadThing решит внедрить Send вручную, он берет на себя бремя гарантии не только своих собственных инвариантов, но и ThreadThing.

0 голосов
/ 24 мая 2018

Ответ: да, вы можете, при некоторых очень специфических условиях.Нужно ли вам это делать - это другое дело.

Вы можете определить реализацию отрицательной черты для другой черты, если черта, которую вы отрицаете:

  • авто-черта.
  • из текущего ящика.

Таким образом, будет работать следующее ( детская площадка ):

#![feature(optin_builtin_traits)]

auto trait Scary {}

trait ThreadThing { }
impl !Scary for ThreadThing {}

Но это не будет работать, если выпытались сделать:

impl !Send for ThreadThing {}

Или, если Scary не был автоматической чертой.

Обратите внимание, однако, что в общем случае не должно быть необходимости отмечать черту !Sendв этом случае.Конкретные реализации черты будут помечены Send или !Send компилятором Rust на основе содержимого реализующей структуры.

...