Size: a a a

2020 November 19

t

timcryt in Rust Beginners
Есть ли какой-нибудь способ потреблять динамически диспетчеризируемые объекты? Просто вызывать методы, их потребляющие нельзя: компилятор ругается.
источник

А⚙

Антон ⚙️ in Rust Beginners
timcryt
Есть ли какой-нибудь способ потреблять динамически диспетчеризируемые объекты? Просто вызывать методы, их потребляющие нельзя: компилятор ругается.
Покажи код
источник

SS

Slava Sokolovsky in Rust Beginners
timcryt
Есть ли какой-нибудь способ потреблять динамически диспетчеризируемые объекты? Просто вызывать методы, их потребляющие нельзя: компилятор ругается.
А как ты представляешь такой объект хранить на стеке?
источник

MB

Mikail Bagishov in Rust Beginners
timcryt
Есть ли какой-нибудь способ потреблять динамически диспетчеризируемые объекты? Просто вызывать методы, их потребляющие нельзя: компилятор ругается.
принимай их по какому-нибудь владеющему указателю, например Box<dyn XXX>
источник

t

timcryt in Rust Beginners
Антон ⚙️
Покажи код
Я хочу сделать что-то наподобие такого https://play.rust-lang.org/?version=stable&mode=debug&edition=2018&gist=fb08646fb1dafd51a2f608b5afde4efa
источник

А⚙

Антон ⚙️ in Rust Beginners
Тут есть несколько вариантов
источник

d

diabolo in Rust Beginners
сигнатуру поменяй на &self
источник

t

timcryt in Rust Beginners
Так и смысл в том, что функция consume должна потреблять то, что ей дают, чтобы не было лишнего клонирования в реализациях этой функции для не Copy типов
источник

А⚙

Антон ⚙️ in Rust Beginners
1) Можно добавить, если это возможно, blanket impl для Box:

impl<T: Foo + ?Sized> Foo for Box<T> {
   fn consume(self) {}
}

2) Можно поменять сигнатуру метода у трейта:

trait Foo {
   fn consume(self: Box<Self>);
}

Но тогда придётся менять все реализации
источник

d

diabolo in Rust Beginners
timcryt
Так и смысл в том, что функция consume должна потреблять то, что ей дают, чтобы не было лишнего клонирования в реализациях этой функции для не Copy типов
ааа, я тебя не понял
источник

t

timcryt in Rust Beginners
Антон ⚙️
1) Можно добавить, если это возможно, blanket impl для Box:

impl<T: Foo + ?Sized> Foo for Box<T> {
   fn consume(self) {}
}

2) Можно поменять сигнатуру метода у трейта:

trait Foo {
   fn consume(self: Box<Self>);
}

Но тогда придётся менять все реализации
Спасибо, поменял, скомпилировалось, к счастью не успел много реализаций написать
источник

А⚙

Антон ⚙️ in Rust Beginners
timcryt
Спасибо, поменял, скомпилировалось, к счастью не успел много реализаций написать
А реализуют unsized locals — и твой первоначальный вариант скомпилируется
источник

JC

Julian =) Coffee in Rust Beginners
unsized locals это же те же самые VLA из сишки по сути?
источник

А⚙

Антон ⚙️ in Rust Beginners
Julian =) Coffee
unsized locals это же те же самые VLA из сишки по сути?
Только не про массивы, а про произвольные unsized значения
источник

JC

Julian =) Coffee in Rust Beginners
Просто в сишке от них что-то отказались, вроде бы.
А в Расте вводят или хотят вводить🤔
источник

JC

Julian =) Coffee in Rust Beginners
Антон ⚙️
Только не про массивы, а про произвольные unsized значения
ну, да, более обобщенно
источник

SS

Slava Sokolovsky in Rust Beginners
Julian =) Coffee
Просто в сишке от них что-то отказались, вроде бы.
А в Расте вводят или хотят вводить🤔
Пусть вводят, могут позволить
источник

JC

Julian =) Coffee in Rust Beginners
И то правда
источник
2020 November 20

EG

Emmanuel Goldstein in Rust Beginners
Adatan
внутри которого хранится это, как мне собственно, достать его и проматчить?
источник

EG

Emmanuel Goldstein in Rust Beginners
Julian =) Coffee
Просто в сишке от них что-то отказались, вроде бы.
А в Расте вводят или хотят вводить🤔
VLA очень небезопасные.
источник