@kotlin_lang

Страница 955 из 982
Mikhail
17.10.2018
11:44:43
Надо на android попробовать собрать

Алексей
17.10.2018
11:44:45
Меня вот всегда интересовало - кто все эти люди, которые голосуют в опросах, о которых я слышу только результаты??

Andrey
17.10.2018
11:44:45
общестенность давит ) задралло нервы тратить на объяснения )
Ну один раз пришли к решению в команде, прописали в гайдлайны с объяснениями, всех вновь прибывших отправляешь читать.

Mikhail
17.10.2018
11:45:36
Google
Andrey
17.10.2018
11:47:53
А еще лучше настроить линтер чтобы сразу валил сборку и сам писал что не так
Не поможет. Придётся объяснять, почему линтер так настроен. Для этого и пишется гайдлайн с разъяснениями, чтобы самому каждый раз не объяснять одно и то же.

Хекс
17.10.2018
11:48:10
имеет ли смысл выделять однострочную строку тройными кавычками? часто вижу как иде предлагает переделать конкатинацию строк и переменных в строку с тройными кавычками и ${...}

сам обычно пользуюсь " и $

Хекс
17.10.2018
11:52:16
хотя наверно это из-за того что решили не читать есть ли в строке \n

Vladimir
17.10.2018
14:32:45
можно. делаешь приватный конструктор и фабричный метод
У инлайн классов же вроде обязателен публичный конструктор

Mikhail
17.10.2018
14:35:52
надо писать KEEP

Google
Vladimir
17.10.2018
14:36:48
пока
Есть идеи, что с этим делать?

Я имею в виду с тем, что в Java-коде можно менять содержимое инлайн-класса

Руслан
17.10.2018
14:38:54
Roman
17.10.2018
14:38:58
С этим ничего не сделать. Если боитесь что из Java кода кто-то будет менять, то не используейте inline classes.

Но вообще мы тут подстели соломки. Никакую фукнцию которая принимат паметр типа "inline class" нельзя вызвать из Java

Vladimir
17.10.2018
14:39:56
Quantum Harmonizer
17.10.2018
14:40:26
Изначальный вопрос решается использованием энамов.

Roman
17.10.2018
14:40:47
Не забить. Есть защита. От reflection, конечно, не защиться. Но на reflection забъем (с помощью него вообще много чего можно сломать)

Vladimir
17.10.2018
14:41:13
Отлично!

Andrey
17.10.2018
14:42:40
inline class, судя по описанию, то же самое, что и newtype в Haskell. То есть просто способ на уровне системы типов различить оборачиваемое значение и обёрнутое. Зачем вам тогда фабричный метод для него? Чем просто использование конструктора не устраивает?

Andrey
17.10.2018
14:44:21
То есть inline class по идее существует только во время компиляции. В рантайме он полностью заменяется обёрнутым значением

Mikhail
17.10.2018
14:44:28
так бы был фабричный метод, возвращающий String50CharacterLong?

Andrey
17.10.2018
14:44:48
тем что мы не можем сделать типа inline class String50CharacterLong
Ну inline class для подобных ограничений и не предназначен.

Mikhail
17.10.2018
14:44:56
как ето

почему нет?

по-моему, отличный юзкейс

или, например, inline class ValidSomething

Andrey
17.10.2018
14:46:19
Но делали-то его не под этот юз кейс

Google
Andrey
17.10.2018
14:51:21
Это просто способ дописать свою реализацию для чего-то, что уже реализовано иначе в оборачиваемом типе. Вот хочется вам, чтобы для текстов length не учитывал пробельные символы и пунктуацию, но length для String уже работает иначе. Вы делаете inline class Text(val s: String) и реализуете свой length в нём

При этом, после компиляции, всё кроме length будет работать напрямую с обёрнутой строкой, и нет оверхеда на создание Text

https://kotlinlang.org/docs/reference/inline-classes.html Вот тут вроде всё очень подробно и с примерами описано. Написано, зачем нужно, как работает.

Boris
17.10.2018
15:00:27
Andrey
17.10.2018
15:01:04
и не для этого, ящитаю
Ну вы почитайте документацию и примеры. Там как раз для этого и используют. Наверно разработчикам языка виднее, зачем они ту или иную фичу реализуют.

Mikhail
17.10.2018
15:01:23
а для чего?
прежде всего, для того чтобы "натянуть домен на типы"

Andrey
17.10.2018
15:01:49
это то для чего оно используется в Haskell
inline class по описанию полностью то же, что и newtype в Haskell.

Mikhail
17.10.2018
15:01:58
избавиться от "dialogId: String, messageId: String, botId: String"

Quantum Harmonizer
17.10.2018
15:02:00
а для чего?
Чтобы представить существующий тип как вообще другой тип, безо всего его поведения. Например, обернуть ключи — в UserId, ClientId, ЛюбойДругойId завернуть UUID.

Mikhail
17.10.2018
15:02:51
inline class по описанию полностью то же, что и newtype в Haskell.
но это не значит что его надо именно для этого использовать

Boris
17.10.2018
15:02:59
или, чтобы количество методов в корутине сократить до одного ?

Quantum Harmonizer
17.10.2018
15:03:26
Ну вы почитайте документацию и примеры. Там как раз для этого и используют. Наверно разработчикам языка виднее, зачем они ту или иную фичу реализуют.
Там всего пара примеров. «Дописывать» функциональность удобно экстеншенами, а инлайн-классами всё пробрасывать придётся.

Mikhail
17.10.2018
15:03:32
Quantum Harmonizer
17.10.2018
15:03:44
Boris
17.10.2018
15:04:22
ну, безопасный тайпалиас всяко лучше, чем тот, что пропускает замену типов и непозволяет инкапсулировать поведение обрачиваемого класса

Mikhail
17.10.2018
15:04:29
на самом деле они хороши для всех трех случаев

Google
Andrey
17.10.2018
15:04:37
Чтобы не подсунуть чужой id
Значит у вас есть разное поведение для UserId, ClientId и прочего, которое вы по типам и разводите.

Quantum Harmonizer
17.10.2018
15:05:43
нет, просто в другой таблице для такого id не будет записи

Boris
17.10.2018
15:05:52
поведение самого объекта совершенно не обязательно должно быть разным, поведение кода, который с этим объектом работает может сильно отличаться

Mikhail
17.10.2018
15:06:10
нет, просто в другой таблице для такого id не будет записи
так это и значит, что тебе есть разница, с каким id работать

это, имхо, разное поведение

Admin
ERROR: S client not available

Boris
17.10.2018
15:08:03
поведением обычно называют набор методов, интерфейс, а интерфейс как раз может быть абсолютно одинаковый, типа toUUID() ?

и возвращать они просто будет uuid, но вот спутать их в исопльзуемом коде уже будет невозможно

в отличии от тайпалиаса

я так думаю, что только из за одного кейза врядли стали бы вводить целый новый класс, скорее всего была идея решить целый спект задач

Mikhail
17.10.2018
15:09:50
поведением обычно называют набор методов, интерфейс, а интерфейс как раз может быть абсолютно одинаковый, типа toUUID() ?
то что методы называются одинкаово, еще не значит, что интерфейсы одинаковые, мы ведь не на питоне пишем?

Boris
17.10.2018
15:10:26
поэтому оно и назыается поведением, а не интерфейсом в привычном понимании

да это спор о терминах

суть в том, что классы могут быть абсолютно идентичны, но использоваться по-разному и это кейз для инлайн-классов

Andrey
17.10.2018
15:15:10
На примере разных Id: Есть у вас задача: доставать имя по Id. При этом для СlientId надо доставать из одного источника, для UserId из другого, но все они UUID. Если просто передавать UUID - не ясно, откуда брать имя. Если есть inline class - пишем val ClientId.name get() {...} val UserId.name get() {...} Вот у нас и реализовано разное поведение, в зависимости от типа Id

Без inline class тоже всё это можно, но будет оверхэд на создание обёрток.

Boris
17.10.2018
15:19:10
мне кажется, что главная фича, это что инлайн-класс может инкапсулировать в себе тип оборачиваемого объекта и предоставлять специфичный интерфейс без потерь на инстанцировании враппера

Google
Quantum Harmonizer
17.10.2018
15:39:55
Интересно, а если inline class оборачивает примитив, его можно сделать const val? ?

Quantum Harmonizer
17.10.2018
15:41:04
нельзя ?

и что это должно значить?
то же, что и с примитивами — «заинлайни меня, пожалуйста»

Andrey
17.10.2018
15:41:29
Так сам id не знает имени. И нет гарантии, что для этого ID существует соответствующая запись.
Да, сам Id не знает, но можно сделать интерфейс Named с абстрактным полем name и реализовать его в ClientId и UserId

Quantum Harmonizer
17.10.2018
15:42:03
Boris
17.10.2018
16:18:02
а rc версии грейдл-плагинов где лежат?

cline-овый грейдл чот странно как-то дружит с билд-файлами на котлине

точнее сказать, никак не дружит

а rc версии грейдл-плагинов где лежат?
они лежат в центральной репе плагинов

Larymar
17.10.2018
17:22:43
если что это андроид, но к сожалению там все молчат



Андрей
17.10.2018
17:23:48
а так кастить в байт массив легально вообще?

Larymar
17.10.2018
17:24:11
а так кастить в байт массив легально вообще?
о вот подсказали, что не легально

Bogdan
17.10.2018
17:47:49
Какие есть гарантии что Array<Float> c оптимизируется в FloatArray ?

Mikhail
17.10.2018
17:48:10
Bogdan
17.10.2018
17:49:46
хм, кажется, что никаких
да проверил на простом примере(((

Larymar
17.10.2018
17:50:18
да проверил на простом примере(((
проверь а большом, оптимизации работают как им нравится

Leonid
17.10.2018
17:50:35
Да не умеет он так

Страница 955 из 982