better elvis + throw
+added run {}
This commit is contained in:
parent
835333dfad
commit
95c1da60ed
@ -225,6 +225,19 @@ It works much like `also`, but is executed in the context of the source object:
|
||||
assertEquals(p, Point(2,3))
|
||||
>>> void
|
||||
|
||||
## run
|
||||
|
||||
Executes a block after it returning the value passed by the block. for example, can be used with elvis operator:
|
||||
|
||||
var someVar = null
|
||||
val result = someVar ?: run {
|
||||
someVar = 121
|
||||
"reset"
|
||||
}
|
||||
assertEquals("reset", result)
|
||||
assertEquals(121, someVar)
|
||||
>>> void
|
||||
|
||||
## Math
|
||||
|
||||
It is rather simple, like everywhere else:
|
||||
@ -1311,6 +1324,7 @@ See [math functions](math.md). Other general purpose functions are:
|
||||
| flow {} | create flow sequence, see [parallelism] |
|
||||
| delay, launch, yield | see [parallelism] |
|
||||
| cached(builder) | remembers builder() on first invocation and return it then |
|
||||
| let, also, apply, run | see above, flow controls |
|
||||
|
||||
|
||||
# Built-in constants
|
||||
|
@ -376,6 +376,11 @@ class Compiler(
|
||||
|
||||
}
|
||||
|
||||
"throw" -> {
|
||||
val s = parseThrowStatement()
|
||||
operand = Accessor { s.execute(it).asReadonly }
|
||||
}
|
||||
|
||||
else -> operand?.let { left ->
|
||||
// selector: <lvalue>, '.' , <id>
|
||||
// we replace operand with selector code, that
|
||||
|
@ -315,6 +315,9 @@ open class Obj {
|
||||
args.firstAndOnly().callOn(copy(Arguments(thisObj)))
|
||||
thisObj
|
||||
}
|
||||
addFn("run") {
|
||||
args.firstAndOnly().callOn(this)
|
||||
}
|
||||
addFn("getAt") {
|
||||
requireExactCount(1)
|
||||
thisObj.getAt(this, requiredArg<Obj>(0))
|
||||
|
@ -2961,5 +2961,25 @@ class ScriptTest {
|
||||
""".trimIndent())
|
||||
}
|
||||
|
||||
@Test
|
||||
fun testElvisAndThrow() = runTest {
|
||||
eval("""
|
||||
val x = assertThrows {
|
||||
null ?: throw "test" + "x"
|
||||
}
|
||||
assertEquals( "testx", x.message)
|
||||
""".trimIndent())
|
||||
}
|
||||
|
||||
@Test
|
||||
fun testElvisAndRunThrow() = runTest {
|
||||
eval("""
|
||||
val x = assertThrows {
|
||||
null ?: run { throw "testx" }
|
||||
}
|
||||
assertEquals( "testx", x.message)
|
||||
""".trimIndent())
|
||||
}
|
||||
|
||||
|
||||
}
|
Loading…
x
Reference in New Issue
Block a user