
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
а ну мб

illiatshurotshka❄️
06.12.2017
16:54:47

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

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
ну короче сэлф появился из-за того что тайпклассы натягивают на ооп
пока что меня больше раздражают что выделяют новые названия на одно и то же являение

illiatshurotshka❄️
06.12.2017
17:18:04

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

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

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

? animufag ?
06.12.2017
17:20:07
наверное
объясни почему главный

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

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);
}
ток не полиморфный небось