Информация об изменениях

Сообщение Re[3]: Опциональные типы от 19.02.2017 16:08

Изменено 19.02.2017 16:09 vsb

Re[3]: Опциональные типы
Здравствуйте, x-code, Вы писали:

vsb>>Все пункты являются. Но есть важное отличие. У нулябельной ссылки есть "неявный оператор приведения" к целевому типу, который кидает исключение (или валит программу) в случае NULL-а, в большинстве ЯП. То же про float и пользовательский тип. Это большой недостаток. Если он исправлен (например в Kotlin так), тогда вообще проблем нет.


XC>А можете рассказать поподробнее, что там в Kotlin?


Optional на уровне языка и реализован через ссылочный тип, т.е. максимально эффективно. Есть немного "синтаксического сахара", позволяющего со всем этим работать удобно.

var s1: String? // "?" означает, что s1 имеет nullable тип, т.е. может принимать строки или null
s1 = null
s1 = "something"
var s2: String // null принимать не может
s2 = s1 // ошибка
s2 = s1!! // так можно, в случае null будет выброшено исключение
if (s1 == null) {
  s2 = "empty"
} else {
  s2 = s1
} // так тоже можно, компилятор отслеживает проверки и внутри else будет знать, что s1 гарантированно не null, поэтому его тип внутри этого блока меняется, собственно это и позволяет писать нормальный код без проблем
s2 = s1 ?: "empty" // то же самое, но с более красивым синтаксисом, что-то вроде map над Optional
val s1Length: Int? = s1?.length // ?. проверяет s1 на null и выполняет функцию, если не null либо возвращает null
val s2LengthOrZero: Int = s1?.length ?: 0 // комбинируя предыдущие два пункта
Re[3]: Опциональные типы
Здравствуйте, x-code, Вы писали:

vsb>>Все пункты являются. Но есть важное отличие. У нулябельной ссылки есть "неявный оператор приведения" к целевому типу, который кидает исключение (или валит программу) в случае NULL-а, в большинстве ЯП. То же про float и пользовательский тип. Это большой недостаток. Если он исправлен (например в Kotlin так), тогда вообще проблем нет.


XC>А можете рассказать поподробнее, что там в Kotlin?


Optional на уровне языка и реализован через ссылочный тип, т.е. максимально эффективно. Есть немного "синтаксического сахара", позволяющего со всем этим работать удобно.

var s1: String? // "?" означает, что s1 имеет nullable тип, т.е. может принимать строки или null
s1 = null
s1 = "something"
var s2: String // null принимать не может
s2 = s1 // ошибка
s2 = s1!! // так можно, в случае null будет выброшено исключение
if (s1 == null) {
  s2 = "empty"
} else {
  s2 = s1
} // так тоже можно, компилятор отслеживает проверки и внутри else будет знать, что s1 гарантированно не null, поэтому его тип внутри этого блока меняется, собственно это и позволяет писать нормальный код без проблем
s2 = s1 ?: "empty" // то же самое, но с более удобным синтаксисом
val s1Length: Int? = s1?.length // ?. проверяет s1 на null и выполняет функцию, если не null либо возвращает null
val s2LengthOrZero: Int = s1?.length ?: 0 // комбинируя предыдущие два пункта