Существуют ли шаблоны проектирования для ржавчины, например, функции безопасности объектов?

Я новичок в Rust. Мне бы очень хотелось, чтобы однажды я смог писать безопасный код на Rust. Я вижу все основания для его существования и его цели, и я на 100% поддерживаю его. Изучив довольно много разных языков, я сказал себе, что больше не буду изучать ни один новый язык. Я думаю, что Rust заслуживает исключения.

В любом случае.

Есть вещи, с которыми я довольно сильно борюсь. Например:

pub trait PrivateKey {
   fn generate(&self) -> Self;
}

pub struct Node {
   pk: Box,
}

Это не компилируется из-за безопасности объектов. Я понимаю, зачем это нужно. Но мне сложно проектировать с учетом таких проблем.

  1. Вероятно, это законно хотеть другого рода PrivateKey реализации, так как уже существуют разные и могут появиться новые.
  2. Я хочу, чтобы мой узел имел ссылку на закрытый ключ, поскольку он должен использоваться во многих случаях.

Поэтому я хочу определить в одном месте какова реализация PrivateKey, а затем иметь возможность ее использовать. Я хочу создать его экземпляр (следовательно, нет new функция в типаже), но затем иметь возможность генерировать фактические байты и возвращать свой экземпляр. Таким образом, я смогу использовать один и тот же абстрактный код в одном месте для генерации нового закрытого ключа, а затем использовать его.

Но объектно-безопасный признак не может вернуться Self. Так как же мне решить такие проблемы? Есть ли общие закономерности или (как мне на самом деле кажется) нужно каждый раз искать нестандартные решения?

Если вы можете жить с постоянной упаковкой и стиранием PrivateKey, вы могли бы использовать признак fn, возвращающий упакованный/стертый тип:

        pub trait PrivateKey {
            fn generate(&self) -> Box;
        }

(Я предполагаю, что вы имеете в виду pub struct Node кстати, это не такая уж особенность.)

ЧИТАТЬ  Пространство для перемен: дизайн интерьера, адаптирующийся к стилю

3 лайка

Ах да, извините, очевидно, это структура. Отредактирую пост.

Что вы подразумеваете под стиранием?

Вот что dyn SomeTrait вызывается, поскольку тип, реализующий эту особенность, потерян/стерт.

Работает ли у вас черта, которую я описал?

1 Нравится

Подпись та же самая Clone::clone. Может быть, вы ищете способ клонирования Box.


Принуждение от struct ImplementorOfTrait к dyn Trait (как в Box также называется «стиранием типа».

Если вместо клонирования Box вы хотели вернуть базовый тип, вот где принижение придет. Или, может быть, вам следует переосмыслить идею использования объектов типажей, если это так — в Rust реже печатают стирание и пытаются повсеместно выполнять приведения типов. Может быть, вы хотите делать Node универсальный с PrivateKey + Clone Вместо этого привязаны там, где это необходимо. Или, может быть, использовать enum вместо этого, если вам нужно всего несколько локальных реализаций.

3 лайка

Да, это работает для меня. Я не могу оценить, лучший ли это способ сделать это для моего варианта использования, но на данный момент это работает! Думаю, я могу пометить это как решение.

Таким образом, я получил несколько ответов на мою конкретную проблему реализации. Однако мне еще предстоит научиться самому находить лучшие решения, а также оценивать, что лучше всего подходит для моего варианта использования.

Тем не менее, учебные пособия и страницы, которые я видел до сих пор, обучают основным функциям языка, но, как несколько опытный долгосрочный программист, работающий с более сложными сценариями, я часто теряюсь, пытаясь определить лучшие практики для более сложных задач. .

ЧИТАТЬ  Инструменты для повышения эффективности руководителей

Итак, мой другой вопрос: существуют ли какие-либо шаблоны проектирования или какие-либо образовательные ресурсы, которые обучают подобным вещам? Или вы учитесь по ходу дела, применяя решения к текущей проблеме и, таким образом, учитесь шаг за шагом? Не уверен, что мой вопрос имеет смысл…

Возможно, вам захочется подумать о том, что сказал @quinedot о подписи generate. Странно, что у него есть &self параметр, поскольку это означает, что он создает один PrivateKey из другого PrivateKey. Это заставляет задуматься, действительно ли вам нужен этот метод в вашей черте, и не может ли возникнуть недопонимание. Вы пытаетесь создать признак для какой-либо фабрики PrivateKey?

1 Нравится

Мое основное предположение заключается в том, что независимо от того, какая реализация, закрытый ключ необходимо каким-то образом генерировать. Однако этот шаг часто «внешний», в том смысле, что просто предполагается, что предоставляется закрытый ключ, однако часто в каком-то жестко закодированном виде. Но если он предоставлен, я не уверен, что смогу легко преобразовать его в свою черту? Вот почему я хотел включить его фактическое поколение в свою черту.

Мне нужно подумать, действительно ли мне нужно сгенерировать закрытый ключ самому, или есть способ получить собственный ключ. PrivateKey разработчик черт из произвольной реализации криптографического закрытого ключа.

Если вам нужен собственный признак для закрытых ключей, вы всегда можете обернуть сгенерированный ключ в структуру, реализующую этот признак. Это обычное дело.

Но я думаю, вы на правильном пути, когда говорите, что сначала нужно разобраться, как их генерировать.

ЧИТАТЬ  5 решений для хранения вещей в маленькой квартире — больше места с умными идеями! -В МОЕЙ КОМНАТЕ

1 Нравится

Source

Оцените статью
( Пока оценок нет )
Строительство. Ремонт. Садоводство