@kotlin_lang

Страница 809 из 982
I
14.08.2018
14:28:53
Да я смотрел доку и информации недостаточно, вот, к примеру есть такой код if (view?.visibility == View.VISIBLE) фактически view это id, а значит int, что будет если view == null?

Google
Костя
14.08.2018
14:29:56
view это не id и не Int

это объект View

I
14.08.2018
14:30:35
view это не id и не Int
android:id="@+id/view" это инт

Костя
14.08.2018
14:30:55
у инта нет поля visiblity

значит скорее всего в деле kotlin layout extensions

они, в простом понимании, делают вместо id объект

когда вы дергаете view оно заменяется уже готовым объектом view из layout

I
14.08.2018
14:34:36
у инта нет поля visiblity
ага, вот как это работает понял, спасибо. так если есть такое view?. как я понял оно не будет исполнятся если null верно? но let делает аналогично, только там можно запихнуть много строк или есть ещё какой-то нюанс?

Костя
14.08.2018
14:35:33
let это метод, в простом понимании чтобы выполнить код если объект не null

но это очень простое, но такой ходовой пример использования

? это для проверок конструкция

Google
Костя
14.08.2018
14:36:04
я неочень понимаю как это сравнить

I
14.08.2018
14:36:53
a?.toInt в каких случая преобразуется в инт? только если a не равно null, верно?

Костя
14.08.2018
14:37:10
ну если view.?visiblity будет null, если view null, то проверка вида null == View.VISIBLE вернет false

иначе null

I
14.08.2018
14:42:15
ну я вот об этом, тогда почему такая конструкция if (string?.length == 2) { return string!!.toUpperCase() } требует два восклицательных знака, ведь мы уже знаем, что string не null если if выполнился

I
14.08.2018
14:44:47
кажется, string переменная или находится в другом модуле
string это просто любая переменная типа стринг, на деле там имя code

Quantum Harmonizer
14.08.2018
14:45:27
string это просто любая переменная типа стринг, на деле там имя code
а, потому что выражение в условии не так просто проанализировать

Kirill
14.08.2018
14:46:10
jied
14.08.2018
14:46:53
смарткаст должен сработать, да

I
14.08.2018
14:48:14
my bad. если там val, то второй !! не нужен
это var но видимо действительно смарткаст работает плохо

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

Alexander
14.08.2018
14:58:18
да видимо это неидеальный смарткаст, просто это вводит в заблуждение когда начинаешь изучать котлин, думаешь на правильном ли ты пути)
Вообще я бы уточнил, что тут было изначально. Смарткаст может работать лучше, чем сейчас, но вывод типов просто через If вполне рабочий. Попробовал все кейсы, которые пришли в голову, везде, где это безопасно, он выводит: class Foo(val foo: Int?) class Bar(var bar: Int?) fun main(args: Array<String>) { val foo1 = Foo(1) val foo2 = Foo(null) val bar1 = Bar(2) val bar2 = Bar(null) val int1: Int? = 3 val int2: Int? = null var varInt1: Int? = 4 var varInt2: Int? = null if (foo1.foo != null) { println(foo1.foo + 5) } if (foo2.foo != null) { println(foo2.foo + 5) } // if (bar1.bar != null) { // println(bar1.bar + 5) // doesn't work, possible multithreading // } // if (bar2.bar != null) { // println(bar2.bar + 5) // doesn't work, possible multithreading // } bar1.bar?.let { println(it + 5) //alternative to commented code } bar2.bar?.let { println(it + 5) //alternative to commented code } if (int1 != null) { println(int1 + 5) } if (int2 != null) { println(int2 + 5) } if (varInt1 != null) { println(varInt1 + 5) } if (varInt2 != null) { print(varInt2 + 5) } } Наверное можно попытаться анализировать, что к чему-то вряд ли есть доступ в других потоках и давать послабления, но не факт и сложнее.

Более сложные случаи работают аналогично: class Foo(var str: String?) class Bar(val str: String?) fun main(args: Array<String>) { var s: String? = "something" val foo = Foo("some") val bar = Bar("body") if (s?.length == 2) { print(s.capitalize()) } // if (foo.str?.length == 2) { // print(foo.str.capitalize()) //doesn't work // } if (bar.str?.length == 2) { print(bar.str.capitalize()) } }

Bogdan
14.08.2018
15:02:10
Mi
14.08.2018
15:05:16
Bogdan
14.08.2018
15:05:35
I
14.08.2018
15:06:11
Нужен thread local
что это значит?

Google
Bogdan
14.08.2018
15:07:48
что это значит?
гугл ? не не слышали https://www.google.com.ua/search?q=thread+local&oq=thread+local&aqs=chrome..69i57j0l5.294j0j7&sourceid=chrome&ie=UTF-8

I
14.08.2018
15:08:20
посмотрел вот такую конструкцию он тоже не хочет кушать if(view?.iisClickable) {} как её можно правильно записать или проверять на null а потом смотреть clickable как в java?

Ivan
14.08.2018
15:09:08
== true

Mi
14.08.2018
15:12:51
что это значит?
Если просто - надо филд присвоить локальной переменной и с ней работать

Mi
14.08.2018
15:13:45
Потому что компилятор не знает что с этим филдом происходит в соседнем потоке

I
14.08.2018
15:14:36
view я так понял var ?
интересный вопрос) это view лейаута как котлин extensions задаёт не знаю

view != null && view.isClickable || view?.isClickable == true || view?.isClickable != null
проще тогда if (view != null && view.isClickable) {}

I
14.08.2018
15:19:47
idea подчеркивает
не подчеркнута, значит val

I
14.08.2018
15:20:41
Потому что компилятор не знает что с этим филдом происходит в соседнем потоке
у меня это внутренняя переменная в методе следовательно при обращении из разных потоков будет создаваться вновь, так что проблем с потокобезопасностью не будет

Alexander
14.08.2018
15:22:11
у меня это внутренняя переменная в методе следовательно при обращении из разных потоков будет создаваться вновь, так что проблем с потокобезопасностью не будет
Можешь показать чуть более детально кусок кода? Я попробовал и кидал код чуть выше, если строка внутри метода создана, то он хоть с var, хоть с val может в смарт каст.

I
14.08.2018
15:25:44
Можешь показать чуть более детально кусок кода? Я попробовал и кидал код чуть выше, если строка внутри метода создана, то он хоть с var, хоть с val может в смарт каст.
сейчас уже не смогу, так как коллега переделал код в силу того что студия ругалась и он уже отличается, но как только столкнусь ещё раз, то вернусь с кодом, но остался ещё вопрос с isClickable

I
14.08.2018
15:28:09
На isClickable уже несколько человек ответило выше :)
да но я так и не понял, можно ли написать более лаконично, чем if (view != null && view.isClickable) или все-таки это самая подходящая конструкция

Alexander
14.08.2018
15:29:29
Ну альтернатива - view?.isClickable == true Короче чем эти два варианта вряд ли напишешь.

Google
Alexander
14.08.2018
17:02:51
Alexander
14.08.2018
17:20:07
А чего читать. Создание тред внутри метода и смотрите, к чему у него доступ есть. Или просто лчмбду

Andrew
14.08.2018
17:20:35
Если вдруг view == null -- исключительная ситуация в этом куске кода, можно ещё написать val view = view ?: error("view should be initialized here"), что заведёт nonnull локальную переменную и кинет исключение с осмысленным текстом, если там таки был null.

Andrew
14.08.2018
17:23:57
Но а) надо понимать, что полетит исключение, если всё плохо, и б) надо понимать, что если вдруг var снаружи поменяется, локальная переменная сохранит старое значение, т.е. если снаружи есть какое-то varObj.dispose(); varObj = null, а метод всё ещё держит val, то жди беды.

Admin
ERROR: S client not available

Andrew
14.08.2018
17:27:33
я делаю только локальную, глобальную только в том случае, если объект создается в рантайме но потом я увверен что он не будет нулл, или еще чего
Случаи разные бывают, метод может пережить наружный объект. Главное об этом помнить :) В контексте всяких onclick-ов в андроиде это, конечно, неактуально.

Disly
14.08.2018
22:25:10
Кэп

?Kolay
14.08.2018
23:43:45
А есть шаблон для котлин реакт, под гранд?

Rikland
15.08.2018
05:30:31
Был нормальный язык, а теперь взяли и втащили unsigned

Vladimir
15.08.2018
05:32:50
Rikland
15.08.2018
05:34:22
Их не просто так в Java не добавили

Alexander
15.08.2018
05:39:53
?‍♂️

Куда втащили, кого втащили? Вы сначала думайте, потом пишите. Unsigned типы введены на уровне библиотеки, не на уровне языка. Примитивы от этого вообще никак не меняются.

В Java их на самом деле добавили, но только в 8 и не очень удобным образом.

Vladimir
15.08.2018
05:42:35
В Java их на самом деле добавили, но только в 8 и не очень удобным образом.
Ну как добавили... Я бы не назвал ЭТО добавлением unsigned типов

Alexander
15.08.2018
05:44:34
На уровне реализации это по сути ровно то же самое, что делает Kotlin. Разница в том, что котлин позволяет обернуть это все в приятный синтаксис

Google
Alexander
15.08.2018
05:47:01
https://docs.oracle.com/javase/8/docs/api/?java/lang/Integer.html все методы со словом unsigned

То же самое в лонге

Alexandr
15.08.2018
05:48:16
уоу, апасна

попахивает unsafe)

в плане логики

я так понимаю это больше для контроля переполнения

Alexander
15.08.2018
05:49:40
Ну ничего особо опасного не вижу. Просто раньше все эти беззнаковые операции делали ручками, что еще более опасно. Главное в каком-то месте не перепутать знаковый Int и беззнаковый

Boris
15.08.2018
05:49:48
Alexander
15.08.2018
05:49:49
По привычке написал котлиновский тип

я так понимаю это больше для контроля переполнения
Нет, это как раз для беззнаковых операций. Взаимодействие с сишным кодом и железками. Для железок особо полезно

Ну и всякие бинарные протоколы передачи данных

Rikland
15.08.2018
06:30:25
Ну и всякие бинарные протоколы передачи данных
Ты же все равно не возьмёшь указатель и не засунешь его в функцию write

Alexander
15.08.2018
06:30:50
Не понял вообще про что это было

Какая функция write? И какой указатель если на то пошло. Текущая реализация unsigned в Kotlin не генерит никаких указателей. От слова совсем.

Rikland
15.08.2018
06:35:02
Указатель на data class. И не закинешь в write

Alexander
15.08.2018
06:35:57
Какое отошение data class имеет к unsigned?

с инлайн классами не перепутали?

Засовывание в "write" (если быть более точным, то в ByteBuffer::putInt) происходит при помощи бесплатного метода, который превращает unsigned в обычный Int.

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