Size: a a a

2020 August 02

V

Vetro in rust_offtopic
Alex Zhukovsky
ну вот а с тайпклассами и "странным объявлением снаружи" такое можно сделать
Нашёл на SO такой вариант

public static class Add<T>
{
   public static readonly Func<T, T, T> Do;

   static Add()
   {
       var par1 = Expression.Parameter(typeof(T));
       var par2 = Expression.Parameter(typeof(T));

       var add = Expression.Add(par1, par2);

       Do = Expression.Lambda<Func<T, T, T>>(add, par1, par2).Compile();
   }
}
источник

V

Vetro in rust_offtopic
Насколько это норм?
источник

V

Vetro in rust_offtopic
int sum = Add<int>.Do(x, y);
источник

Т8

Т-34 85 in rust_offtopic
Alex Zhukovsky
ну вот чтобы про это не думать в самом простом варианте все типы совпадают
так не интересно
источник

V

Vetro in rust_offtopic
Или надо именно с оператором?
источник

AZ

Alex Zhukovsky in rust_offtopic
Vetro
Нашёл на SO такой вариант

public static class Add<T>
{
   public static readonly Func<T, T, T> Do;

   static Add()
   {
       var par1 = Expression.Parameter(typeof(T));
       var par2 = Expression.Parameter(typeof(T));

       var add = Expression.Add(par1, par2);

       Do = Expression.Lambda<Func<T, T, T>>(add, par1, par2).Compile();
   }
}
сравнительно нормально
источник

AZ

Alex Zhukovsky in rust_offtopic
но оптимизироваться будет плохо (точнее - никак)
источник

V

Vetro in rust_offtopic
Это да
источник

V

Vetro in rust_offtopic
А как тогда наиболее быстро и правильно? С интерфейсами определёнными для разных типов?
источник

AZ

Alex Zhukovsky in rust_offtopic
Vetro
А как тогда наиболее быстро и правильно? С интерфейсами определёнными для разных типов?
можно эмулировать скаловые имплиситы
источник

AZ

Alex Zhukovsky in rust_offtopic
void Main()
{
   var numbers = new[] { 1, 2, 3, 4, 5 };
   var strings = new[] {"Hello", " ", "World" , "!"};
   Console.WriteLine(MConcat<int, IntSGroup>(numbers));
   Console.WriteLine(MConcat<string, StringSGroup>(strings));
}

public interface SGroup<T> // наш тайпкласс
{
   public T Zero { get; }
   public T Add(T x, T y);
}

public struct IntSGroup : SGroup<int> // реализации для наших типов - привет, имплиситы
{
   public int Zero => 0;
   public int Add(int x, int y) => x + y;
}

public struct StringSGroup : SGroup<String>
{
   public string Zero => "";
   public string Add(string x, string y) => x + y;
}

// пример абстрактного кода, работающего с тайпклассами
public static T MConcat<T, TGroup>(IEnumerable<T> items) where TGroup : struct, SGroup<T> {
   var typeclass = default(TGroup);
   return items.Aggregate(typeclass.Zero, typeclass.Add);
}
источник

AZ

Alex Zhukovsky in rust_offtopic
но по сути это эмуляция тайпклассов
источник

AZ

Alex Zhukovsky in rust_offtopic
просто потому что тайпклассы просто лучше)
Примерно как паттерн матчинг лучше свитча. Эволюция в этом направлении
источник

Т8

Т-34 85 in rust_offtopic
Alex Zhukovsky
мне нужно чтобы код работал когда у тебя нет готового списка sbyte/byte, не говоря про то что это выглядет херово
скажи, пожалуйста, тебе реально такое понадобилось? Расскажи подробнее, при каких обстоятельствах?

можно ещё так
https://t.me/rust_offtopic/338906
источник

Т8

Т-34 85 in rust_offtopic
сдаётся мне, что фэпэшники сами себе проблемы придумывают
источник

AZ

Alex Zhukovsky in rust_offtopic
Т-34 85
скажи, пожалуйста, тебе реально такое понадобилось? Расскажи подробнее, при каких обстоятельствах?

можно ещё так
https://t.me/rust_offtopic/338906
источник

AZ

Alex Zhukovsky in rust_offtopic
у меня интерфейс одной сборке
источник

AZ

Alex Zhukovsky in rust_offtopic
а реализации в других
источник

AZ

Alex Zhukovsky in rust_offtopic
если делать без тайпклассов то либо тащить диай либо добавлять зависимости на левые сборки
источник

AZ

Alex Zhukovsky in rust_offtopic
Т-34 85
сдаётся мне, что фэпэшники сами себе проблемы придумывают
как меня бесит твоё нежелание считать чужие проблемы за проблемы
источник