@oop_ru

Страница 412 из 785
kana
06.12.2017
16:41:47
не ну меня трейты раста как-то разочаровали

все думал, что это как тайпклассы, а потом почитал отрывок из книги по расту

illiatshurotshka❄️
06.12.2017
16:42:23
Дык поправь, чо.
я просто на нее не линкую

Google
kana
06.12.2017
16:44:32
да дело не в хкт, сам синтаксис какой-то странный какой-то self, не понятно, где переменные типов (и че, тогда будет self2, если две переменные)? Че вообще за селф? Это интерфейсы что ли?

illiatshurotshka❄️
06.12.2017
16:44:58
ват

self это сахар для self: Self

kana
06.12.2017
16:45:15
вот хочу я сделайть трейт для Cast a b where cast :: a -> b

illiatshurotshka❄️
06.12.2017
16:45:58
trait Cast<A, B> { fn cast(A) -> B; }

kana
06.12.2017
16:46:42
во, вот это норм выглядит, а в книге какая-то херня



то есть self в принципе можно не использовать?

illiatshurotshka❄️
06.12.2017
16:47:11
все нормально в книге

kana
06.12.2017
16:47:11
зачем он вообще?

почему не trait Animal<T> { // Static method signature; Self refers to the implementor type. fn new(name: &'static str) -> T; // Instance method signatures; these will return a string. fn name(&self: T) -> &'static str; fn noise(&self: T) -> &'static str; // Traits can provide default method definitions. fn talk(&self: T) { println!("{} says {}", self.name(), self.noise()); } }

illiatshurotshka❄️
06.12.2017
16:47:59
зачем он вообще?
чтобы брать тип к которому имплементирован трейт

здесь лишнее повторение типа в твоем коде

Google
kana
06.12.2017
16:49:25
так это главное различие интерфейсов от тайпклассов - у тайпклассов нет “типа, к которому они имплементированы”, они как шаблоны, они могут принимать в качестве аргументов 0-N типов

andretshurotshka?❄️кде
06.12.2017
16:50:50
а если он имплементирован к генерик типу

kana
06.12.2017
16:51:33
распиши, я вопроса не понял

andretshurotshka?❄️кде
06.12.2017
16:52:02
если T это Something<A>

kana
06.12.2017
16:52:33
а какая разница? Something<A> это уже * же

если ты про раст, то в расте же нет хкт, там не сделать трейт под A<B>, A :: * -> *, B :: k

поэтому вопроса все еще не понял

andretshurotshka?❄️кде
06.12.2017
16:54:36
а ну мб

kana
06.12.2017
16:55:44
по факту то, что в раст ввели Self, говорит о том, что авторы хотели именно продвинутые интерфейсы, а не тайпклассы

illiatshurotshka❄️
06.12.2017
16:56:20
с чего бы

kana
06.12.2017
16:56:56
потому что у тайпклассов нет такого понятия как self, повторюсь, а вот у интерфейсов есть

illiatshurotshka❄️
06.12.2017
16:57:30
да нет

в расте просто первый аргумент имплицитен

kana
06.12.2017
16:58:19
FromInt a where fromInt :: Int -> a будет так выглядеть: trait FromInt { fromInt(x: Int) -> Self; }

andretshurotshka?❄️кде
06.12.2017
16:59:11
impl<T, U> Something<T> for U { // всякая такая дичь }

kana
06.12.2017
16:59:12
в расте просто первый аргумент имплицитен
что и является фишкой интерфейсов

trait Cast<A, B> { fn cast(A) -> B; }
так, я не понял, а тут Self где? Он уже не имплицитный? Или он все еще есть но не используется?

illiatshurotshka❄️
06.12.2017
17:01:44
не используется

kana
06.12.2017
17:01:59
имея импл Cast<Int, String> я не смогу сделать 4.cast() :: String -- “4” или cast(4) :: String ?

Google
kana
06.12.2017
17:02:31
не используется
и тебе не чувствуется этот запах?

illiatshurotshka❄️
06.12.2017
17:04:19
троллишь что ли

kana
06.12.2017
17:06:17
нет, я показываю, почему трейты раста меня разочаровали как тайпклассы (но тем не менее годное решение как расширенные интерфейсы)

andretshurotshka?❄️кде
06.12.2017
17:06:33
Cast::cast(4)

вроде

? animufag ?
06.12.2017
17:09:57
зачем он вообще?
дык точечка же

ну ещё мб этот сэлф связан с сабтайпингом

kana
06.12.2017
17:13:59
ну короче я не говорю, что трейты плохие, только меня коробит немного, когда говорят, что трейты и тайпклассы - синонимы, потому что это тупо неверно

? animufag ?
06.12.2017
17:17:21
ну короче сэлф появился из-за того что тайпклассы натягивают на ооп

пока что меня больше раздражают что выделяют новые названия на одно и то же являение

? animufag ?
06.12.2017
17:18:31
причём тайпклассы возможно не лучшее название, но кажется трейты и протоколы тоже такое

kana
06.12.2017
17:19:12
ты сам признал, что трейты селфоцентричны, то есть имеется некий главный аргумент Self и некоторые другие типы-аргументы

это и есть интерфейсы)

andretshurotshka?❄️кде
06.12.2017
17:20:00
а в идрисе тайпклассы?

andretshurotshka?❄️кде
06.12.2017
17:20:57
мемс

Google
kana
06.12.2017
17:21:08
я могу ошибаться, так как знаком с растом очень мало, но сделать импл для каста я так и не смог

типа такого: trait Cast<A, B> { fn cast(A) -> B; } impl Cast<i8, i8> { fn cast(x : i8) -> i8 { x } } fn main() { let x: i8 = Cast<i8, i8>::cast(2); println!("{}", x); }

почему?

потому что требуется селф, для которого будет имплементация

без него никак

? animufag ?
06.12.2017
17:23:32
а что он пишет?

kana
06.12.2017
17:24:40
а вот если сделать вокруг Self, то все норм

trait Cast<T> { fn cast(self) -> T; } impl Cast<i8> for i8 { fn cast(self) -> i8 { self } } fn main() { let x: i8 = 2; let y: i8 = x.cast(); println!("{}", y); }

illiatshurotshka❄️
06.12.2017
17:24:45
а что он пишет?
impl A { } имплементирует набор функций для типа A

kana
06.12.2017
17:24:58
да

никакого impl Cast<> for _ {} я не нашел

andretshurotshka?❄️кде
06.12.2017
17:27:27
impl<T> Cast<i8, i8> for T { fn cast(x : i8) -> i8 { x } }

хз работает или нет

illiatshurotshka❄️
06.12.2017
17:28:08
работает

и вызывается через <()>::cast(2);

кек

с тем, что это плохое решение я согласен. но не согласен что это делает трейты интерфейсами из ооп языков

andretshurotshka?❄️кде
06.12.2017
17:29:31
а как с трейта вызвать?

illiatshurotshka❄️
06.12.2017
17:30:00
лол
можно даже <!>

Google
illiatshurotshka❄️
06.12.2017
17:30:35
что значит с трейта вызвать

andretshurotshka?❄️кде
06.12.2017
17:30:43
Cast::cast

illiatshurotshka❄️
06.12.2017
17:31:07
не понял что ты хочешь

andretshurotshka?❄️кде
06.12.2017
17:31:22
<Type as Trait>::function(receiver_if_method, next_arg, ...);

? animufag ?
06.12.2017
17:31:24
а как Eq в расте определён?

andretshurotshka?❄️кде
06.12.2017
17:31:53
trait Pilot { fn fly(&self); } trait Wizard { fn fly(&self); } struct Human; impl Pilot for Human { fn fly(&self) { println!("This is your captain speaking."); } } impl Wizard for Human { fn fly(&self) { println!("Up!"); } } impl Human { fn fly(&self) { println!("*waving arms furiously*"); } } fn main() { let person = Human; Pilot::fly(&person); Wizard::fly(&person); person.fly(); }

illiatshurotshka❄️
06.12.2017
17:31:57
pub trait PartialEq<Rhs = Self> where Rhs: ?Sized, { fn eq(&self, other: &Rhs) -> bool; }

andretshurotshka?❄️кде
06.12.2017
17:31:58
пример из доки

illiatshurotshka❄️
06.12.2017
17:32:50
andretshurotshka?❄️кде
06.12.2017
17:33:00
без self такое не сделать?

не понял
Pilot::fly(&person); Wizard::fly(&person);

illiatshurotshka❄️
06.12.2017
17:34:10
да причем это?

ты не понимаешь наверное что делает impl<T> . for T

? animufag ?
06.12.2017
17:37:30
ну вообще хз что он делает

как бы вот тут i8 подставляешь

и ещё зачем-то говоришь что это законно для любого T которое параметр этой реализации

andretshurotshka?❄️кде
06.12.2017
17:38:32
кароч вот норм вариант

trait Cast<A, B> { fn cast(A) -> B; } impl Cast<i8, i8> for i8 { fn cast(x : i8) -> i8 { x } } fn main() { let a: i8 = 2; let x: i8 = <i8>::cast(a); println!("{}", x); }

ток не полиморфный небось

Страница 412 из 785