Lua学习笔记函数

来源:互联网 发布:淘宝网床上用品 编辑:程序博客网 时间:2024/05/18 09:26

数字型for 的格式,exp3默认为1
  for var=exp1 , exp2 , exp3  do
  <执行体>
  end
泛型for迭代的类型,标准库中提供了几种迭代器:
  io.lines() 用于迭代文件中每行
  pairs() 迭代table中元素
  ipairs() 迭代 数组 元素
  string.gmatch() 迭代字符串中单词
  
一,函数
  多重返回值:x , y = foo() 
  foo()返回值就是2个值,并不是table或者其他类型。
  t = { foo() }  这是再封装 成为一个table。{ “a” , “b” }
  
  变长参数:function add ( ... )
  在函数内部使用这些参数  依然使用 ... 来表示,此时,这个表达式 是一个像多重返回值一样的序列,不是table。当然,可以再包装 { ... }。这也是通常函数内遍历变长参数的方式。
  function fwrite ( fmt , ... )
  return io.write( string.format( fmt, ...) )
  end
  
  具名实参:
  w = Window{ x=0 , y=0 , width=300 , height=200,
  title = “Lua” , background=”blue”,
  border = true }
  Window函数只有一个参数(当函数只有一个参数时,调用时可以去掉圆括号),并且,这个参数需要我们用table,就可以实现具名参数了。
  
  深入函数:
  第一类值:函数(这个函数本身,而非其返回值,其实现我们可以理解为类似于C中的函数指针被存储)可以存储到变量中,或者table中,可以作为实参传递给其他函数,还可以作为作为其他函数的返回值。词法域:类似于JS中的闭包。
  函数名,一个拥有某函数的变量。函数与所有其他值一样都是匿名的。
  foo = function( x )  return 2*x  end
  
  table.sort ( onetable , function( a , b ) 
  return (a.name > b.name) 
  end 
  )


对一些函数的访问,想要建立一个安全的运行环境,比如,限制一个程序访问文件:
  do
  local  oldOpen = io.open
  local access_OK = function ( filename , mode )
  <检查访问权限>
  end
  io.open  =  function ( filename , mode )
  if access_OK( filename , mode ) then
  return oldOpen( filename , mode )
  else
  return  nil , “access denied”
  end
  end
  end
  
  正确的尾调用:
  function f ( x )  return g( x )  end  ---yes
  function f ( x )   g( x )  end  ---not
  “尾调用”不需要消耗任何栈信息,即,当g返回时,程序执行点将直接返回 调用f的地方。可以理解为,在f返回并调用g的时候,f 已经被清栈,之后接着调用g,g结束后自然栈调用信息直接到了,f的调用者的地方。
  “尾调用”  return <func> ( <args> )
  非常适合状态机一类程序。
  截取一段例子:
  funciton room1 ()
  local move = io.read()
  if  move == “south” then return room3()
  elseif  move == “east” then return room2()
  else
  print( “invalid move” )
  return room1()  --stay in the same room
  end
  end

0 0
原创粉丝点击