module mainfnmain() { a := ['a','b','c']println(variadic_fn_a(...a)) //数组解构赋值后,传递给不确定参数数组}fnvariadic_fn_a(a ...string) string {returnvariadic_fn_b(...a) //数组解构赋值后,传递给不确定参数数组}fnvariadic_fn_b(a ...string) string {// a0 := a[0]// a1 := a[1]// a2 := a[2]//return '$a0$a1$a2'mut x :=''for s in a { x +='$s' }return x}
不确定个数参数的类型也可以是指针类型:
module mainfntake_variadic_string_ptr(strings ...&string) { //指针类型take_array_string_ptr(strings)}fntake_array_string_ptr(strings []&string) {println(*strings[0] =='a')println(*strings[1] =='b')}fnmain() { a :='a' b :='b'take_variadic_string_ptr(&a,&b)}
函数返回值
函数的返回值可以是单返回值,也可以是多返回值。
因为有了这个特性,其他语言中有的元组类型Tuple,在V语言中就不太需要了。
fnbar() int { //单返回值return2}fnfoo() (int,int) { //多返回值return2,3}fnsome_multiret_fn(a int, b int) (int,int) {return a +1, b +1//可以返回表达式}fnmain() { a, b :=foo()println(a) // 2println(b) // 3}
fnmain() {dump(f2(f))dump(f2(|x, y|2* x - y)) //简写的lambda表达式,等价于函数f}pub fnf(x int, y int) int {return2* x - y}pub fnf2(cb fn (x int, y int) int) int { a :=2 b :=3returncb(a, b)+1}
函数递归
函数支持递归调用:
// hanoi towerconst ( num =7)fnmain() {hanoi(num,'A','B','C')}fnmove(n int, a string, b string) {println('Disc $n from $a to ${b}...')}fnhanoi(n int, a string, b string, c string) {if n ==1 {move(1, a, c) } else {hanoi(n -1, a, c, b)move(n, a, c)hanoi(n -1, b, a, c) }}
import syncfnmain() { f1 :=fn (a int) { // 定义函数类型变量println('hello from f1') }f1(1) f2 :=fn (a int) { // 定义函数类型变量println('hello from f2') }f2(1)fn (a int) { // 匿名函数定义同时调用println('hello from anon_fn') }(1)// 匿名函数结合go使用mut wg := sync.new_waitgroup()gofn (mut wg sync.WaitGroup) {println('hello from go') wg.done() }(mut wg) wg.wait()}
函数注解
@[deprecated]
模块发布给其他用户使用后,如果模块的某个函数想要声明作废或者被代替,可以使用作废注解。
@[deprecated] //函数作废注解pub fnext(path string) string {panic('Use `filepath.ext` instead of `os.ext`') //结合panic进行报错提示}@[deprecated:'可以在这里写说明'] //带说明的作废注解,编译器提示函数作废的时候会显示出来pub fn (p Point) position() (int,int) {return p.x, p.y}@[deprecated:'这是作废说明']@[deprecated_after: '2021-03-01'] //在某个日期后开始作废,一定要放在deprecated后,才会警告pub fnfn1() (int,int) (int,int) {return p.x, p.y}// 编译时,函数被调用,就会出现如下警告:// warning: function `fn1` has been deprecated since 2021-03-01; 这是作废说明
@[inline]
inline注解的功能跟C函数的inline函数一样。
@[inline] //函数inline注解pub fnsum(x y int) int {return x+y}@[inline] //方法inline注解pub fn (p Point) position() (int,int) {return p.x, p.y}
[xxx/main.v:2] n <= 1: false[xxx/main.v:2] n <= 1: false[xxx/main.v:2] n <= 1: false[xxx/main.v:2] n <= 1: false[xxx/main.v:2] n <= 1: true[xxx/main.v:3] 1: 1[xxx/main.v:5] n * factorial(n-1): 2[xxx/main.v:5] n * factorial(n-1): 6[xxx/main.v:5] n * factorial(n-1): 24[xxx/main.v:5] n * factorial(n-1): 120