splat any Iterable
This commit is contained in:
parent
2b87845a40
commit
397dcaae92
@ -70,7 +70,31 @@ destructuring arrays when calling functions and lambdas:
|
|||||||
fun getFirstAndLast(first, args..., last) {
|
fun getFirstAndLast(first, args..., last) {
|
||||||
[ first, last ]
|
[ first, last ]
|
||||||
}
|
}
|
||||||
getFirstAndLast( ...(1..10).toList() )
|
getFirstAndLast( ...(1..10) ) // see "splats" section below
|
||||||
>>> [1, 10]
|
>>> [1, 10]
|
||||||
|
|
||||||
|
# Splats
|
||||||
|
|
||||||
|
Ellipsis allows to convert argument lists to lists. The inversa algorithm that converts [List],
|
||||||
|
or whatever implementing [Iterable], is called _splats_. Here is how we use it:
|
||||||
|
|
||||||
|
fun testSplat(data...) {
|
||||||
|
println(data)
|
||||||
|
}
|
||||||
|
val array = [1,2,3]
|
||||||
|
testSplat("start", ...array, "end")
|
||||||
|
>>> ["start", 1, 2, 3, "end"]
|
||||||
|
>>> void
|
||||||
|
|
||||||
|
There could be any number of splats at any positions. You can splat any other [Iterable] type:
|
||||||
|
|
||||||
|
fun testSplat(data...) {
|
||||||
|
println(data)
|
||||||
|
}
|
||||||
|
val range = 1..3
|
||||||
|
testSplat("start", ...range, "end")
|
||||||
|
>>> ["start", 1, 2, 3, "end"]
|
||||||
|
>>> void
|
||||||
|
|
||||||
|
|
||||||
[tutorial]: tutorial.md
|
[tutorial]: tutorial.md
|
||||||
|
@ -8,8 +8,18 @@ suspend fun Collection<ParsedArgument>.toArguments(context: Context): Arguments
|
|||||||
for (x in this) {
|
for (x in this) {
|
||||||
val value = x.value.execute(context)
|
val value = x.value.execute(context)
|
||||||
if (x.isSplat) {
|
if (x.isSplat) {
|
||||||
(value as? ObjList) ?: context.raiseClassCastError("expected list of objects for splat argument")
|
when {
|
||||||
|
value is ObjList -> {
|
||||||
for (subitem in value.list) list.add(Arguments.Info(subitem, x.pos))
|
for (subitem in value.list) list.add(Arguments.Info(subitem, x.pos))
|
||||||
|
}
|
||||||
|
|
||||||
|
value.isInstanceOf(ObjIterable) -> {
|
||||||
|
val i = (value.invokeInstanceMethod(context, "toList") as ObjList).list
|
||||||
|
i.forEach { list.add(Arguments.Info(it, x.pos)) }
|
||||||
|
}
|
||||||
|
|
||||||
|
else -> context.raiseClassCastError("expected list of objects for splat argument")
|
||||||
|
}
|
||||||
} else
|
} else
|
||||||
list.add(Arguments.Info(value, x.pos))
|
list.add(Arguments.Info(value, x.pos))
|
||||||
}
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user