54 lines
		
	
	
		
			686 B
		
	
	
	
		
			V
		
	
	
			
		
		
	
	
			54 lines
		
	
	
		
			686 B
		
	
	
	
		
			V
		
	
	
| fn foo() string {
 | |
| 	println('foo()')
 | |
| 	return 'foo'
 | |
| }
 | |
| 
 | |
| fn foo2() string {
 | |
| 	println('start')
 | |
| 	defer { println('defer') }
 | |
| 	defer { println('defer2') }
 | |
| 	println('end')
 | |
| 	return foo()
 | |
| }
 | |
| 
 | |
| fn test_defer() {
 | |
| 	assert foo2() == 'foo'
 | |
| }
 | |
| 
 | |
| fn set_num(i int, n mut Num) {
 | |
| 	defer { n.val++ }
 | |
| 	println("Hi")
 | |
| 	if i < 5 {
 | |
| 		return
 | |
| 	} else {
 | |
| 		n.val++
 | |
| 	}
 | |
| }
 | |
| 
 | |
| fn set_num_opt(n mut Num) ?int {
 | |
| 	defer { n.val = 1 }
 | |
| 	return 99
 | |
| }
 | |
| 
 | |
| struct Num {
 | |
| mut:
 | |
| 	val int
 | |
| }
 | |
| 
 | |
| fn test_defer_early_exit() {
 | |
| 	mut sum := Num{0}
 | |
| 	for i in 0..10 {
 | |
| 		set_num(i, mut sum)
 | |
| 	}
 | |
| 	println("sum: $sum.val")
 | |
| 	assert sum.val == 15
 | |
| }
 | |
| 
 | |
| fn test_defer_option() {
 | |
| 	mut ok := Num{0}
 | |
| 	set_num_opt(mut ok) or {
 | |
| 		assert false
 | |
| 	}
 | |
| 	assert ok.val == 1
 | |
| }
 |