Size: a a a

Rust — русскоговорящее сообществo

2020 November 04

ИЛ

Иван Лещенко... in Rust — русскоговорящее сообществo
Тогда как вариант
Path::new(&OsStr).join(&str)
источник

ИЛ

Иван Лещенко... in Rust — русскоговорящее сообществo
Кстати, стоп, это неправильная конструкция в любом случае
источник

ИЛ

Иван Лещенко... in Rust — русскоговорящее сообществo
источник

Z

Zymlex (Юрий) in Rust — русскоговорящее сообществo
Спасибо, осталось решить головоломку с borrowчекером 😕
источник

IL

Ilya Lakhin in Rust — русскоговорящее сообществo
Привет!

Я вот похоже не понимаю про visibility вот какую вещь.

У меня есть публичный модуль такого вида:


pub(crate) struct PrivateType {}

pub(crate) mod private_module {
 pub trait PrivateTrait { fn foo(&self, pr: &PrivateType);  }
}

pub struct PubType {}

impl PrivateTrait for PubType { fn foo(&self, pr: &PrivateType) {} }


Компилятор ругается, говорит, что в impl функция foo утекает приватный тип PrivateType.

Но если в приватном подмодуле сам трейт я объявляю как pub(crate) trait PrivateTrait, то все работает хорошо.

Почему так происходит? И почему такое странное сообщение об ошибке? PrivateType-то в любом случае приватный, и PrivateTrait тоже приватный фактически, так как в приватном модуле.
источник

EG

Emmanuel Goldstein in Rust — русскоговорящее сообществo
Ilya Lakhin
Привет!

Я вот похоже не понимаю про visibility вот какую вещь.

У меня есть публичный модуль такого вида:


pub(crate) struct PrivateType {}

pub(crate) mod private_module {
 pub trait PrivateTrait { fn foo(&self, pr: &PrivateType);  }
}

pub struct PubType {}

impl PrivateTrait for PubType { fn foo(&self, pr: &PrivateType) {} }


Компилятор ругается, говорит, что в impl функция foo утекает приватный тип PrivateType.

Но если в приватном подмодуле сам трейт я объявляю как pub(crate) trait PrivateTrait, то все работает хорошо.

Почему так происходит? И почему такое странное сообщение об ошибке? PrivateType-то в любом случае приватный, и PrivateTrait тоже приватный фактически, так как в приватном модуле.
У тебя трейт публичный полностью, а в нём используется что-то, что публичное только внутри крейта
источник

EG

Emmanuel Goldstein in Rust — русскоговорящее сообществo
Так нельзя
источник

IL

Ilya Lakhin in Rust — русскоговорящее сообществo
Emmanuel Goldstein
У тебя трейт публичный полностью, а в нём используется что-то, что публичное только внутри крейта
Так ведь трейт в приватном модуле. Как он публичный-то?
источник

IL

Ilya Lakhin in Rust — русскоговорящее сообществo
Кроме того, даже если я этот трейт внутри приватного модуля явно помечу, как приватный, то impl трейта ведь все равно будет в публичном модуле. И он на это не ругается, не смотря на то, что в его функции по прежнему используется приватный тип.
источник

IL

Ilya Lakhin in Rust — русскоговорящее сообществo
Собственно говоря, я нашел решение проблемы, но не понял, почему оно так работает?
источник

IL

Ilya Lakhin in Rust — русскоговорящее сообществo
А этак не работает(как я вначале написал)
источник

IL

Ilya Lakhin in Rust — русскоговорящее сообществo
Ну и еще вопрос. На тему областей видимости. Если я объявляю подмодуль(приватный, скажем, хотя не важно), и в нем имплеменчу какой-нибудь трейт. К примеру, Default. Для какого-нибудь внешнего типа. То я этот тип должен явно объявить внутри подмодуля в форме use .... Но затем сам Default::default() для этого типа я могу свободно использовать вне подмодуля, ничего не объявляя через use. Как Раст разбирается, где заимплеменчен Default? Может он в одном модуле заимплеменчен так, а в другом этак. Или вообще в двух разных крейтах.
источник

EG

Emmanuel Goldstein in Rust — русскоговорящее сообществo
Ilya Lakhin
Ну и еще вопрос. На тему областей видимости. Если я объявляю подмодуль(приватный, скажем, хотя не важно), и в нем имплеменчу какой-нибудь трейт. К примеру, Default. Для какого-нибудь внешнего типа. То я этот тип должен явно объявить внутри подмодуля в форме use .... Но затем сам Default::default() для этого типа я могу свободно использовать вне подмодуля, ничего не объявляя через use. Как Раст разбирается, где заимплеменчен Default? Может он в одном модуле заимплеменчен так, а в другом этак. Или вообще в двух разных крейтах.
Имплементации доступны независимо от того, в какой они области видимости объявлены
источник

EG

Emmanuel Goldstein in Rust — русскоговорящее сообществo
Можно их хоть внутри функции и внутри ифа объявить, ничего не изменится
источник

EG

Emmanuel Goldstein in Rust — русскоговорящее сообществo
Главное, чтобы в правильной области видимости был сам трейт
источник

EG

Emmanuel Goldstein in Rust — русскоговорящее сообществo
источник

IL

Ilya Lakhin in Rust — русскоговорящее сообществo
Emmanuel Goldstein
Имплементации доступны независимо от того, в какой они области видимости объявлены
А если есть две имплементации одного и того же типа в разных крейтах?
источник

EG

Emmanuel Goldstein in Rust — русскоговорящее сообществo
Ilya Lakhin
А если есть две имплементации одного и того же типа в разных крейтах?
Orphan rules не дадут так сделать
1. Ты можешь писать inherent impl только на свой тип
2. Ты можешь писать импл трейта на типе только если тебе принадлежит трейт или тип
источник

IL

Ilya Lakhin in Rust — русскоговорящее сообществo
А, понял
источник

IL

Ilya Lakhin in Rust — русскоговорящее сообществo
ок. Спасибо!
источник