Re: Обнулить свойство
От: Serginio1 СССР https://habrahabr.ru/users/serginio1/topics/
Дата: 04.05.23 14:24
Оценка:
Здравствуйте, vaa, Вы писали:

https://stackoverflow.com/questions/8107134/how-set-value-a-property-selector-expressionfunct-tresult
Вот здесь народ изгалялся. В принципе если кэшировать по типу и свойству должно быстро работать
и солнце б утром не вставало, когда бы не было меня
Отредактировано 04.05.2023 16:28 Serginio1 . Предыдущая версия .
Re[4]: Обнулить свойство
От: Sinclair Россия https://github.com/evilguest/
Дата: 04.05.23 16:20
Оценка:
Здравствуйте, VladD2, Вы писали:
VD>Поля передаются по ссылке. Делаешь универсальный метод в классе и дело в шляпе.
Повторяю вопрос: занафига тогда заводить свойство, если наружу всё равно торчит поле?
Уйдемте отсюда, Румата! У вас слишком богатые погреба.
Re[5]: Обнулить свойство
От: VladD2 Российская Империя www.nemerle.org
Дата: 05.05.23 21:55
Оценка:
Здравствуйте, Sinclair, Вы писали:

S>Повторяю вопрос: занафига тогда заводить свойство, если наружу всё равно торчит поле?


Не хочу повторяться:

Поля передаются по ссылке. Делаешь универсальный метод в классе и дело в шляпе.

где тут поле торчит?
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re: Обнулить свойство
От: Serginio1 СССР https://habrahabr.ru/users/serginio1/topics/
Дата: 06.05.23 13:11
Оценка: 12 (1) -1
Здравствуйте, vaa, Вы писали:

Используй ref свойство!
https://gist.github.com/mgravell/c46a1de553abe325dea0c44ac7fa7766
и солнце б утром не вставало, когда бы не было меня
Re[6]: Обнулить свойство
От: Sinclair Россия https://github.com/evilguest/
Дата: 10.05.23 02:10
Оценка:
Здравствуйте, VladD2, Вы писали:
VD>Не хочу повторяться:
VD>

VD>Поля передаются по ссылке. Делаешь универсальный метод в классе и дело в шляпе.

VD>где тут поле торчит?
Там, откуда оно передаётся по ссылке.
Что за универсальный метод будет в классе?
Уйдемте отсюда, Румата! У вас слишком богатые погреба.
Re[2]: Обнулить свойство
От: vdimas Россия  
Дата: 02.08.23 17:19
Оценка: +1
Здравствуйте, Sinclair, Вы писали:

Угу, плюсовый подход.


S>
S>public abstract class Weird
S>{
S>    public abstract string? Apply(string? value);
S>

Я бы сделал Apply protected.
Re[2]: Обнулить свойство
От: vdimas Россия  
Дата: 02.08.23 18:17
Оценка:
Здравствуйте, Sinclair, Вы писали:

S>Можно напилить библиотеку string transformations, которая построена на перегрузке операторов. Использовать "<<" не выйдет, но оператор & не намного хуже.


В плюсах в либах трансформации обычно используют operator|
Re[3]: Обнулить свойство
От: Sinclair Россия https://github.com/evilguest/
Дата: 03.08.23 05:26
Оценка:
Здравствуйте, vdimas, Вы писали:
V>В плюсах в либах трансформации обычно используют operator|
А можно посмотреть на пример такой либы? Как там вообще что устроено.
Уйдемте отсюда, Румата! У вас слишком богатые погреба.
Re[4]: Обнулить свойство
От: vdimas Россия  
Дата: 03.08.23 12:47
Оценка:
Здравствуйте, Sinclair, Вы писали:

V>>В плюсах в либах трансформации обычно используют operator|

S>А можно посмотреть на пример такой либы?

Одна из таких популярных — Boost.Range.
Это набор концептов/адаптеров/алгоритмов для связи всего со всем через итераторы.

Живой пример:
#include <boost/range/algorithm.hpp>
#include <boost/range/adaptors.hpp>
#include <boost/phoenix.hpp>

#include <iostream>

using namespace boost::phoenix::arg_names;
using namespace boost::adaptors;
using namespace boost;
using namespace std;

int main() 
{
    vector<int> const     input  { 1, 2, 3, 4, 5, 3 };
    ostream_iterator<int> output { cout, ", " };

    range::copy(input | filtered(arg1 % 2) | transformed(arg1 * 7) | reversed | uniqued, 
                output);
            
    return 0;
}


Раздел доки про адаптеры:
https://www.boost.org/doc/libs/1_82_0/libs/range/doc/html/range/reference/adaptors/introduction.html

Полная дока либы:
https://www.boost.org/doc/libs/1_82_0/libs/range/doc/html/index.html


S>Как там вообще что устроено.


Если вопрос про синтаксис, то примерно как и у тебя — вводится доп. тип сугубо для оператора пайпа (по аналогии с передачей данных через stdio в консольных программах).
Каждый адаптер идёт в двух вариантах:
Syntax Code
Pipe rng | boost::adaptors::filtered(pred)
Function boost::adaptors::filter(rng, pred)
Верхний "модный" вариант раскрывается в нижний классический.

Результатом применения адаптера является объект-ренж — это объект такого типа, для которого определены операции begin(rng) и end(rng), т.е. у которого можно получить пару итераторов.
Отредактировано 03.08.2023 16:59 vdimas . Предыдущая версия . Еще …
Отредактировано 03.08.2023 12:50 vdimas . Предыдущая версия .
Отредактировано 03.08.2023 12:49 vdimas . Предыдущая версия .
Отредактировано 03.08.2023 12:48 vdimas . Предыдущая версия .
Re[2]: Обнулить свойство
От: _FRED_ Черногория
Дата: 07.08.23 12:44
Оценка:
Здравствуйте, Sinclair, Вы писали:

S>Использовать "<<" не выйдет


Почему не выйдет? Relaxing shift operator requirements, Пример
Help will always be given at Hogwarts to those who ask for it.
Re[3]: Обнулить свойство
От: Sinclair Россия https://github.com/evilguest/
Дата: 07.08.23 13:58
Оценка:
Здравствуйте, _FRED_, Вы писали:
_FR>Почему не выйдет?
Потому что у этого оператора слева должен быть custom type. А нам нужно, чтобы слева была строка.
Ведь compound assignment раскрывается из x op= Smth в x = x op Smth.
Уйдемте отсюда, Румата! У вас слишком богатые погреба.
Re[2]: Обнулить свойство
От: Sinclair Россия https://github.com/evilguest/
Дата: 09.08.23 07:50
Оценка:
Здравствуйте, Serginio1, Вы писали:
S>https://gist.github.com/mgravell/c46a1de553abe325dea0c44ac7fa7766
Это — плохая идея.
Кто угодно со ссылкой на объект может менять такое свойство так, как захочется.
С такой семантикой проще отказаться от свойства и выставить наружу голое поле.
Уйдемте отсюда, Румата! У вас слишком богатые погреба.
Re[3]: Обнулить свойство
От: Serginio1 СССР https://habrahabr.ru/users/serginio1/topics/
Дата: 09.08.23 07:56
Оценка:
Здравствуйте, Sinclair, Вы писали:

S>Здравствуйте, Serginio1, Вы писали:

S>>https://gist.github.com/mgravell/c46a1de553abe325dea0c44ac7fa7766
S>Это — плохая идея.
S>Кто угодно со ссылкой на объект может менять такое свойство так, как захочется.
S>С такой семантикой проще отказаться от свойства и выставить наружу голое поле.

Ну и обычное свойство ты можешь менять через set_PropertyName.
Ну и не голое поле, а ref поле. Большой разницы нет. Просто обычно поля не публичны, а свойства публичны через тот же {get;set}
и солнце б утром не вставало, когда бы не было меня
Re[4]: Обнулить свойство
От: Sinclair Россия https://github.com/evilguest/
Дата: 09.08.23 08:55
Оценка:
Здравствуйте, Serginio1, Вы писали:

S> Ну и обычное свойство ты можешь менять через set_PropertyName.

Нет, там вызовется мой сеттер, который может проверять и гарантировать инварианты.
S>Ну и не голое поле, а ref поле. Большой разницы нет. Просто обычно поля не публичны, а свойства публичны через тот же {get;set}
Свойства публичны не через get/set, а через модификатор public. Как, впрочем, и поля.
Я могу себе представить сценарий, что мы объект готовим для подачи в какой-то библиотечный код, который принципиально не умеет работать с FieldInfo, а требует всенепременно PropertyInfo.
Но даже в таком сценарии шансы на то, что этот внешний код готов к ref-свойству — нулевые.

Так что реф-свойство в данном случае — фикция.
Ну, и, опять же, решение является интрузивным. То есть оно требует изменения дизайна всех классов, задействованных в задаче. Что, в свою очередь повлечёт непредсказуемое количество последствий.
Где-то у свойства был нетривиальный сеттер; где-то класс надо было отдавать в биндинг гуя, не умеющий работать с ref string, где-то ещё что-то отвалится.

Как и замена свойства на поле — слишком много усилий для слишком маленького выигрыша.
Уйдемте отсюда, Румата! У вас слишком богатые погреба.
Re[5]: Обнулить свойство
От: Serginio1 СССР https://habrahabr.ru/users/serginio1/topics/
Дата: 09.08.23 09:01
Оценка:
Здравствуйте, Sinclair, Вы писали:


S>Так что реф-свойство в данном случае — фикция.

S>Ну, и, опять же, решение является интрузивным. То есть оно требует изменения дизайна всех классов, задействованных в задаче. Что, в свою очередь повлечёт непредсказуемое количество последствий.
S>Где-то у свойства был нетривиальный сеттер; где-то класс надо было отдавать в биндинг гуя, не умеющий работать с ref string, где-то ещё что-то отвалится.

S>Как и замена свойства на поле — слишком много усилий для слишком маленького выигрыша.


Ну свйство на самом деле внутри может вызывать некий метод, возвращающий ref structure например
https://learn.microsoft.com/ru-ru/dotnet/api/system.span-1.item?view=net-7.0
public ref T this[int index] { get; }
и солнце б утром не вставало, когда бы не было меня
Re[6]: Обнулить свойство
От: Sinclair Россия https://github.com/evilguest/
Дата: 09.08.23 09:30
Оценка:
Здравствуйте, Serginio1, Вы писали:
S> Ну свйство на самом деле внутри может вызывать некий метод, возвращающий ref structure например
S>https://learn.microsoft.com/ru-ru/dotnet/api/system.span-1.item?view=net-7.0
S>
S>public ref T this[int index] { get; }
S>

Это я всё понимаю — просто мы говорим не о ref-свойствах вообще, а об их применении для решения конкретной задачи.
И вот сюда они как раз не подходят.
Уйдемте отсюда, Румата! У вас слишком богатые погреба.
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.