Size: a a a

Сrystal Lang — русскоговорящее сообщество

2021 December 06

АК

Александр Куцан... in Сrystal Lang — русскоговорящее сообщество
> В твоем потомке переопределить это поле и навешать на него converter
 Вот я тоже так хотел, но override полез разве ращрешен?
Я получаю ошибку компиляции
источник

АК

Александр Куцан... in Сrystal Lang — русскоговорящее сообщество
module TimeSpan::Converter
 def self.from_json(value : JSON::PullParser) : Time::Span
   Time::Span.new(nanoseconds: value.read_int)
 end
end

class Cookie < ::HTTP::Cookie
 include JSON::Serializable
 @[JSON::Field(converter: TimeSpan::Converter)]
 @max_age: Time::Span?
end


Ошибка :
Error: can't annotate @max_age in Cookie because it was first defined in HTTP::Cookie
источник

АК

Александр Куцан... in Сrystal Lang — русскоговорящее сообщество
Поделитесь?
источник

G

Gabben in Сrystal Lang — русскоговорящее сообщество
все они связаны с расширением того или иного класса 🤷‍♂️
источник

АК

Александр Куцан... in Сrystal Lang — русскоговорящее сообщество
Не уверен, что это стандартная практика языка делать все типы Json сериализуемыми.
К примеру Time::Span или Cookies .
Я Хочу это у себя в проекте в Json запихнуть, но делат это частью языка это уже спорное предложение
источник

АК

Александр Куцан... in Сrystal Lang — русскоговорящее сообщество
Вы имеете в виду переопределение класса стандартной библиотеки?
источник

G

Gabben in Сrystal Lang — русскоговорящее сообщество
Да
источник

AP

Alexander Popov in Сrystal Lang — русскоговорящее сообщество
Я вижу, что он наследует Object#to_json, но сейчас проверить неудобно.
источник

АК

Александр Куцан... in Сrystal Lang — русскоговорящее сообщество
Я как раз пытаюсь от этого избавится.
Очень не нравится мне практика расширения и переопредленения методов стандартной библиотеки.

А нет еще способа сделать какой-то JsonSerialisable над внешним обьектом?
источник

АК

Александр Куцан... in Сrystal Lang — русскоговорящее сообщество
Вы про Cookies или Time::Span?
Time::Span с json никакого взаимодействия не имеет.
И это еще вопрос как его правильно записывать в json если делать в общем виде ( в секундах или наносекундах) ...
источник

AP

Alexander Popov in Сrystal Lang — русскоговорящее сообщество
Свой сериалайзер написать. Не уверен, как это будет выглядеть для стандартных классов. В рефах есть примеры.
источник

AP

Alexander Popov in Сrystal Lang — русскоговорящее сообщество
Про Time::Span. Увидел в документации, что наследует.
источник

АК

Александр Куцан... in Сrystal Lang — русскоговорящее сообщество
Вот тут можете скинуть ссылку?
Написать сериалайзер нужно так, чтоб не модифицировать оригинальный класс. Но чтоб при конвертации стандартная библиотека поняла,  что для класса есть сериалайзер
источник

AP

Alexander Popov in Сrystal Lang — русскоговорящее сообщество
В рефах не нашёл, в API есть примеры: https://crystal-lang.org/api/latest/JSON/Serializable.html
Но всё же это мутация класса. Кажется, когда-то до 1.0 был именно сериалайзер, теперь через аннотации.
источник

АК

Александр Куцан... in Сrystal Lang — русскоговорящее сообщество
Пасиб попробую так
источник