/
函数扩展是一项强大的功能,让你可以变换、装饰或替换函数的行为。
This is the backbone of the element styling engine, when the extended function is a Markdown primitive, such as .heading. See its page for more details about extending Markdown elements.
你可以使用 .extend 文档 ↗ 函数,在某个作用域内扩展任何先前已声明的函数。该扩展会包裹原始函数,同时不会丢失其原有定义。
.function {greet}
name:
Hello, .name!
.extend {greet}
.super::uppercase
.greet {world}HELLO, WORLD!
在包裹函数体内部,原始函数以 .super 的形式暴露。调用它会以相同的参数来调用原始函数。
包裹函数体是一个 lambda 。它的显式参数(若有)必须与原始函数的参数名称相匹配,并让你可以拦截调用方传入的参数。
由于 .super 就是原始函数本身,它接受相同的参数。你传入的任何参数都会覆盖包裹函数被调用时所用的参数,而所有未提供的参数都会原样透传。
.function {greet}
greeting name:
.greeting, .name!
.extend {greet}
name:
.super greeting:{Howdy}
.greet {Hello} {world}Howdy, world!
新的参数值也可以依赖原始参数,让你在将其传递下去之前先对它们进行变换:
.function {greet}
greeting name:
.greeting, .name!
.extend {greet}
greeting name:
.super greeting:{.greeting::uppercase}
.greet {Hello} {world}HELLO, world!
所有包裹函数的参数始终都是可选的。你只需声明在函数中实际用到的参数。
.function {greet}
greeting name surname:
.greeting, .name .surname!
.extend {greet}
name:
.super name:{.name::uppercase}
.greet {Hello} name:{John} surname:{Doe}Hello, JOHN Doe!
一个可选的 where 行内 lambda 参数让你可以定义一个条件,如果调用时该条件未被满足,整个调用就会回退到原始定义。其参数遵循与函数体 lambda 相同的规则。
.function {greet}
greeting name:
.greeting, .name!
.extend {greet} where:{name: .name::equals {world}}
greeting:
.super greeting:{.greeting::uppercase}
.greet {Hello} {world}
.greet {Hello} {John}HELLO, world!
Hello, John!