scala - Anonymous function as parameter -
def fun(f: int => unit) { f(10) f(20) } println("method 1 call:") fun(i => {println("hi"); println(i)}) println("method 2 call:") fun{println("hi"); println(_)}
the output is:
e:\test\scala>scala i.scala method 1 call: hi 10 hi 20 method 2 call: hi 10 20
i think i => {println("hi"); println(i)}
, println("hi"); println(_)
same. because have 1 parameter , parameter used once, can use _
simplify code.
then, why method 2 print "hi" once? (does mean: if want use _
simple calling, contents on right of =>
can have 1 expression, if have more one, e.g. println("hi"); println(i); then, can not use _
replace?
first, have know in scala { block; of; code }
expression evaluates whatever last expression inside evaluates to.
when say:
fun(i => { println("hi"); println(i) })
you create anonymous function, body contains 2 expressions, both returning ()
, both evaluated when function called, expected.
but when say
fun({println("hi"); println(_)})
you pass in block, not anonymous function. sepp2k explained expands to
{ println("hi"); x => println(x) }
so, pass block fun
, block being evaluated before passed. first println("hi")
happens, printed once block evaluated once, , x => println(x)
evaluated, function int => unit
, prints argument. this, , (as last expression passed fun
. why each time call fun
prints argument twice.
to see further on how block work can @ example more in block
fun { println("building function") val uuidofthisfunction = uuid.randomuuid x => println(s"$uuidofthisfunction, $x") }
so block prepares function giving context through closure. uuid stay same both calls happen if fun
.
building function 86e74b5e-83b5-41f3-a71c-eeafcd1db2a0, 10 86e74b5e-83b5-41f3-a71c-eeafcd1db2a0, 20
the example more did first call be
fun( x => { println("calling function") val uuidofthiscall = uuid.randomuuid println(s"$uuidofthiscall, $x") } )
the block evaluates every time f
called.
calling function d3c9ff0a-84b4-47a3-8153-c002fa16d6c2, 10 calling function a0b1aa5b-c0ea-4047-858b-9db3d43d4983, 20
Comments
Post a Comment