
Bogdan
14.08.2018
14:22:48

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

Quantum Harmonizer
14.08.2018
14:29:35

Google

Костя
14.08.2018
14:29:56
view это не id и не Int
это объект View

I
14.08.2018
14:30:35

Костя
14.08.2018
14:30:55
у инта нет поля visiblity
значит скорее всего в деле kotlin layout extensions
они, в простом понимании, делают вместо id объект
когда вы дергаете view оно заменяется уже готовым объектом view из layout

Quantum Harmonizer
14.08.2018
14:32:36

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

Quantum Harmonizer
14.08.2018
14:35:23

Костя
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 выполнился

Kirill
14.08.2018
14:43:15

Quantum Harmonizer
14.08.2018
14:43:53

I
14.08.2018
14:44:47

Quantum Harmonizer
14.08.2018
14:45:27

Kirill
14.08.2018
14:46:10

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

I
14.08.2018
14:48:14


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

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

Bogdan
14.08.2018
15:09:18

Alexander
14.08.2018
15:10:11

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

Quantum Harmonizer
14.08.2018
15:12:59

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

I
14.08.2018
15:14:36

Bogdan
14.08.2018
15:18:20

I
14.08.2018
15:19:47

I
14.08.2018
15:20:41

Mi
14.08.2018
15:21:12

Alexander
14.08.2018
15:22:11

I
14.08.2018
15:25:44

Alexander
14.08.2018
15:26:49

I
14.08.2018
15:28:09

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

I
14.08.2018
15:30:11

Google

Alexander
14.08.2018
17:02:51

I
14.08.2018
17:19:02

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.

Bogdan
14.08.2018
17:21:24

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

Admin
ERROR: S client not available

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

Andrew
14.08.2018
17:27:33

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

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

Alexandr
15.08.2018
05:46:28

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

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.