Vasily
Ну ебаный почешись
Hog
Эй :)
Vasily
Ну вот у себя в либе нетстандарт пытаюсь его найти
Vasily
И как-то вызвать
Vasily
НЕ ПОЛУЧАЕТСЯ
Ayrat
ок, ща чешусь!
Hog
Мож номер версии не тот?
Hog
Посмотри в какой версии нугета появился этот метод
Vasily
2.1, 4.5.4
Hog
И проверь версии
Vasily
Ну т.е. я честно пытался через руны
Ayrat
Василий прав, в этот нугет его положили только для версий неткора, где он И ТАК уже есть
Ayrat
я прям не понял
Vasily
Поэтому прошу помощи в байтоебстве
Vasily
НЕКОТОРОМ
Vasily
Та версия, что в гисте - рабочая, но будет аллоцировать как не в себя
Крылатый
Ну всё, «Дом-2» закрывается. Как теперь жить?
Hog
А чоб дотпиком не посмотреть в нугет и попробовать такое же?
Hog
Ну, в котором уже есть то, что надо?
Ayrat
Ну, в котором уже есть то, что надо?
ну можно и не дотпиком https://github.com/dotnet/runtime/blob/1d9e50cb4735df46d3de0cee5791e97295eaf588/src/libraries/System.Private.CoreLib/src/System/MemoryExtensions.Globalization.cs#L362-L371
Ayrat
но просто интересно какого хуя это в нугет не положили который и так паблишат
Hog
Спроси там у своих. Во внутреннем СО
Hog
Чо гадать
Ayrat
https://gist.github.com/vshapenko/8dc7f9ae274bc3909ab787b20429b943
я нашел только две аллокации let symbols = text.Split (char 0x200d,StringSplitOptions.None) Some text
Ayrat
первую убрать можно достаточно просто ручным парсером вторую убрать не получится не убрав активный патерн
Ayrat
что делает код в душе ниибу, но аллокация тут вроде одна (не считая активного патерна в целом)
Igor
let symbols = text.Split - ну это одна строка, но аллокаций там больше, это же массив стрингов
Ayrat
ну и чо
Ayrat
я имел в виду что это единственная строка с аллокациями
Ayrat
ее починить изи
Ayrat
ну типа бежим по строке циклом (обычным, не форыч) запоминая индекс, если находим плохой чар, который ломает строку, отдаем спан от предыдущего хорошего индекса до текущего, пиздуем дальше
Ayrat
можно сделать стракт енумератор который будет это делать за нас
Ayrat
на выходе будут получаться спаны на участки строки которые являются ее кусками, разрезанными плохим чаром
Ayrat
0 аллокаций
Vasily
Ну короче там портал в ад открывается
Vasily
Если глубже копать
Hog
Не совсем понятно зачем для такого ф#
Anatoly
let testHttp (url: string) (auth: string option) = task { use req = new HttpRequestMessage(HttpMethod.Get, url) match auth with | None -> () | Some x -> req.Headers.Authorization <- Headers.AuthenticationHeaderValue.Parse(x) return! httpCheck req }
Anatoly
прикольно, null - это, оказывается, Some
Igor
None
Anatoly
ну, нет
Anatoly
у меня пруф есть
Anatoly
Donnie
Null != None
Anatoly
Nikolay
Null != None
Не совсем, под капотом None это null
Nikolay
box None = null
Anatoly
ну все эти опшны тогда бесполезны
gsomix
ну все эти опшны тогда бесполезны
Только если класть в них null. :)
Nikolay
let o: obj option = Some null o |> Option.iter (fun x -> x.ToString())
Nikolay
Бабах
Roman
ну все эти опшны тогда бесполезны
Option.ofObj в местах интеропа
Roman
Но говорить, что опшны бесполезны - это конечно юношеский максимализм
Nikolay
Но говорить, что опшны бесполезны - это конечно юношеский максимализм
Ну это ошибка выжившего получается, опшн не защитил в одном конкретном кейсе, значит опшн бесполезен
Nikolay
Это не ошибка выжившего
Не подобрал более красивого и точного описания
Vlæd
Если нулл класть в Some, потом доставать его оттуда и вызывать на нем метод - какое-то другое поведение кроме nre ожидается? Я на полном серьезе интересуюсь.
Vlæd
И да и нет
Vlæd
Я все ещё работаю над парой тасков
Nikolay
Vlæd
Но поскольку половина всего дотнета в отпусках - работаю вяло крайне :)
Vlæd
Тут скорее подсознательно так выходит, обидно когда завернулся опшнами, а потом на стринге поймал NRE
Ну опшном завернут референс тайп, который в целом может быть и нулрефом. Тут скорее вопросы к стороне, которая его отдаёт.
Vlæd
Но я понимаю, когда тебе говорят - использую опшн и забудь про нре, а у тебя нре взрывается. Чувствуешь себя обманутым :)
Vasily
Option.ofObj сжигает такое
Nikolay
Ну опшном завернут референс тайп, который в целом может быть и нулрефом. Тут скорее вопросы к стороне, которая его отдаёт.
В котлине, кстати, интересно был интероп сделал, там все, что не обмазано атрибутами, считалось опшном
Vlæd
В котлине, кстати, интересно был интероп сделал, там все, что не обмазано атрибутами, считалось опшном
По сути, nullable reference types так и задумывались. Вроде хотели весь рантайм и сдк обмазать ими, хз чем закончилось. У Дона там есть пуллреквест и рфц, которые в фш поддержку добавляют. https://github.com/fsharp/fslang-design/blob/master/RFCs/FS-1060-nullable-reference-types.md
Nikolay
А почему опшнами не обмазать?
Vlæd
Потому что в сишарпе нету опшнов
Ayrat
А почему опшнами не обмазать?
бцл опшнами не обмажешь
Nikolay
Option, ValueOption, Nullable, еще одного нам не хватает
Nikolay
Отличный повод напиться
Ayrat
@vshapenko open System open System.Runtime.CompilerServices [<Struct; IsByRefLike>] type SplitCharEnumerator = val mutable private remaining: ReadOnlySpan<char> val private charToSplit: char val mutable private current: ReadOnlySpan<char> new(str: string, charToSplit: char) = if String.IsNullOrEmpty str then raise (new ArgumentNullException("string is null or empty", nameof(charToSplit))) { remaining = str.AsSpan() charToSplit = charToSplit current = ReadOnlySpan.Empty } member this.Current = this.current member this.GetEnumerator() = this member this.MoveNext(): bool = if this.remaining.IsEmpty then false else let mutable notFinished = true let mutable i = 0 while (notFinished && i < this.remaining.Length) do if this.remaining.[i] = this.charToSplit then notFinished <- false this.current <- this.remaining.Slice(0,i) this.remaining <- this.remaining.Slice(i+1) i <- i + 1 if notFinished then this.current <- this.remaining this.remaining <- ReadOnlySpan<char>.Empty true [<EntryPoint>] let main argv = let mutable enum = SplitCharEnumerator("abc1dser1sdfs1s", '1') while enum.MoveNext() do Console.WriteLine(enum.Current.ToString()) 0
Ayrat
а чо бы нет