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
 | 
						|
}
 |