Как упоминал Роланд, ()
- это оператор вызова, а []
- оператор индекса. ()
используется, помимо прочего, для функций:
fun demo(func: (i: Int) -> Unit){
// These are identical
func(1)
func.invoke(1)
}
[]
- это индексный оператор , который вы хотите применить здесь.
Может использоваться для любого класса, который имеет operator fun get(args)
class Demo {
// These don't actually need a return type either. Or any arguments at all.
// If this was an int-containing class (i.e. a List), this would be the conventional declaration
operator fun get(index: Int) : Int {
return 0 // Obviously with an actual return value.
}
// But they don't have to. They can have multiple, or no arguments.
operator fun get(index: Int, fallback: Int) : Int{
return fallback
}
}
fun test(){
val demo = Demo()
//Depending on arguments, the use is different. Single-arg is basic, and traditional:
val value = demo[12];
// But the multi-arg one can be useful depending on the class.
val value2 = demo[12, 3];
}
Я знаю, что вы не спрашивали об их объявлении, но код является частью моей мысли:
- Оператор индекса применяется к любому классу с
operator fun get
, с любым количеством входных аргументов
- У списков, карт и массивов есть этот метод.
То есть вы хотите использовать [index]
, а не (index)
. В качестве альтернативы вы можете использовать метод и использовать .get(index)
напрямую. Если вы хотите использовать нулевые безопасные вызовы (?.
), вы должны использовать .get(index)
.
Кроме того, вы, как правило, предпочитаете нулевые безопасные вызовы, опционально комбинируемые с ?.let{ }
, ?.forEach { }
или аналогичными, вместо использования нулевого подтверждения. Прежде всего, это своего рода победа над одной из основных частей Kotlin: нулевая безопасность. Во-вторых, если оно когда-либо будет нулевым, приложение будет зависать, вместо того, чтобы изящно сказать пользователю «Что-то пошло не так». Я не знаком с библиотекой, которую вы используете, поэтому честно говоря, я не уверен, что когда null, и может ли он быть нулевым, даже если он успешен.
Что касается let
и forEach
, их проще использовать, когда у вас есть Nullability. Учтите это:
someNullableIterable?.forEach {
// Only invoked if the iterable isn't null
}
По сравнению с:
if(someNullableIterable!= null){
for(item in someNullableIterable!!) { // Needs !! if the variable is global, and it's a var and not a val.
// Foo bar
}
}
Также есть множество похожих функций, и если вам нужно использовать индексы, есть forEachIndexed
. Но просто использование forEach
(или forEachIndexed
) сократит часть вашего кода и позволит вам лучше справляться с обнуляемостью.