首页 > 其他分享 >Lua 中的可变长函数

Lua 中的可变长函数

时间:2024-07-12 16:32:31浏览次数:15  
标签:... 函数 -- fmt 可变 Lua arg print my

可变长函数

Lua中的可变长函数的参数用 ... 来表示 ( 3个 . )
在函数内部有一个特殊的 内置变量 arg

其格式如下
arg =
{
1,
"Hello",
true,
n = 3
}

-- function  makeVarStr(...) to see print_Table.lua

function printMultiArg(...)
	print("... = " .. makeVarStr(arg))
end


function my_print1(fmt, ... )
	print("=================== Begin my_print1 ===================")
	print("fmt = " .. makeVarStr(fmt))


	print("... = " .. makeVarStr(arg))
	print("=================== End my_print1 ===================\n")
end

function my_print2(fmt, ... )
	print("=================== Begin my_print2 ===================")
	print("fmt = " .. makeVarStr(fmt))

	printMultiArg(arg)
	print("=================== End my_print2 ===================\n")
end

function my_print3(fmt, ... )
	print("=================== Begin my_print3 ===================")
	print("fmt = " .. makeVarStr(fmt))

	printMultiArg(...)
	print("=================== End my_print3 ===================\n")
end



a =1
b = "Hello"
c = true
my_print1("a = ??? , b = ??? , c= ??? ",a,b,c)
my_print2("a = ??? , b = ??? , c= ??? ",a,b,c)
my_print3("a = ??? , b = ??? , c= ??? ",a,b,c)

--[[
=================== Begin my_print1 ===================
fmt = "a = ??? , b = ??? , c= ??? "
... = 
{
   [1] = 1,
   [2] = "Hello",
   [3] = true,
   "n" = 3,
}
=================== End my_print1 ===================

=================== Begin my_print2 ===================
fmt = "a = ??? , b = ??? , c= ??? "
... = 
{
   [1] = 
   {
      [1] = 1,
      [2] = "Hello",
      [3] = true,
      "n" = 3,
   },
   "n" = 1,
}
=================== End my_print2 ===================

=================== Begin my_print3 ===================
fmt = "a = ??? , b = ??? , c= ??? "
... = 
{
   [1] = 1,
   [2] = "Hello",
   [3] = true,
   "n" = 3,
}
=================== End my_print3 ===================


]]

##################################################
Nice Version 1
Use select(n, ...) expression
##################################################




--[[
////////////////////////////////////////////////////////////////////////////////////////////////////// 	        
//  Lua Interpret will assignment 
//    The command line arguments as the internal build-in argument named "arg" 
//       instead of "..." in the function argument list
//
// 	   Variadic Arguments
//
//
////////////////////////////////////////////////////////////////////////////////////////////////////// 	        
--]]

function printAll(fmt, ...)
	print("---------- Begin printAll() ----------\n")
	print("fmt = " .. fmt)
	print("arg = " , ... )
	print()

	--
	-- yield the argument list's  Count
	--
	print("# ... = ", select("#", ...) )

	print("******************************")
	for i=1,select("#", ...) do
		-- Here           : (              )  is a must 
		-- ********************************************************************************************************************
		--                  (              ) ==>  force "select(...)" function return only one argument rathan than multiple arguments
		-- ********************************************************************************************************************
		print("  ",i," = ", (select(i, ...)) )
	end
	print("******************************\n")

	print("---------- End printAll() ----------")
end


printAll("Hello-World : ", "a1", "b2", "c3" , 3.14, true, false, nil , "end"); 

---------- Begin printAll() ----------

fmt = Hello-World :
arg = a1 b2 c3 3.14 true false nil end

# ... = 8


    1        =      a1
    2        =      b2
    3        =      c3
    4        =      3.14
    5        =      true
    6        =      false
    7        =      nil
    8        =      end

---------- End printAll() ----------

##################################################################
Nice Version 2
Use 'arg' internal varible
instead of '...'* <= Variadic arguments
#################################################################


print("--------------------------------------------------")
print("outside arg = ",arg)
print("outside arg.n = ",arg.n)
print("--------------------------------------------------\n")


local newgt = { 
	printAll = function(fmt, ...)
		print("fmt = ",fmt)
		print("inner   arg = ", arg)
		print("inner   arg.n = ", arg.n)

		for i,v in pairs(arg) do
			print("\t",i,v)
		end
		return "Done"
	end

}
setmetatable(newgt, { __index = _G })

-- setfenv(...) is avaliable only in lua5.1
setfenv(1, newgt)



print("                                   [1]   [2]  [3]   [4]    [5]  [6]  [7]")
print("Calling " .. [[printAll("format : %d%c", "a1", "b2", "c3", 3.14, true, nil ,false)]])
print( printAll("format : %d%c", "a1", "b2", "c3", 3.14, true, nil ,false) )



outside arg = table: 00B302A0
outside arg.n = nil

                               [1]   [2]   [3]  [4]   [5]   [6]   [7]

Calling printAll("format : %d%c", "a1", "b2", "c3", 3.14, true, nil ,false)
fmt = format : %d%c
inner arg = table: 00B30138
inner arg.n = 7
1 a1
2 b2
3 c3
4 3.14
5 true
7 false
n 7
Done

标签:...,函数,--,fmt,可变,Lua,arg,print,my
From: https://www.cnblogs.com/edisonewton/p/18298653

相关文章

  • 简单理解Lua 协程(coroutine)
    也许更好的阅读体验协程简单理解为可以暂停的线程,但是同一时刻只有一个协程可以处于运行状态。coroutine.create()lua中使用coroutine.create()创建一个协程,参数是一个函数,返回值为创建的协程,这个协程运行内容就是这个函数了。协程有三种状态挂起、运行、停止。协程刚创建时......
  • 适用于react、vue菜单格式化工具函数
    场景在一个动态菜单场景中,你向接口获取树形菜单,但最后拿到的树未能达到你的预期,这个时候就需要手写递归重新处理这颗树适用于react、vue菜单格式化工具函数包含功能1.当前路由是否存在返回按钮判断逻辑:只要存在左侧可点击的菜单都不具备返回按钮,其他则具有返回按钮2.错误......
  • Lua调用C的函数
    #include<iostream>#include<string>usingnamespacestd;extern"C"{#include"lua.h"#include"lualib.h"#include"lauxlib.h"}intmyTest(lua_State*L){//获得Lua函数的参数的数量intn......
  • CRC_CCITT js版的计算函数
    CRC_CCITT,特征多项式:X16+X12+X5+1,即多项式系数为0x1021,初始值为全0,对于单个字节来说最高位先计算,不需要取反直接输出。functioncalculateCRC_CCITT(buffer){constPOLYNOMIAL=0x1021;letcrc=0x0000;//Initialvaluesettoall0sforthisspecificcase......
  • 最全C语言个人笔记【第四章节-函数】
    函数入门在C语言中,函数意味着功能模块。一个典型的C语言程序,就是由一个个的功能模块拼接而成的整体。也因为如此,C语言被称为模块化语言。对于函数的使用者,可以简单的将函数理解为黑箱子,使用者只管按照规定给黑箱一些输入,就会得到一些输出,而不必要理会黑箱子里面的运行细节......
  • 从零开始学习嵌入式----C语言指针函数
    目录拨开迷雾:深入浅出C语言指针函数一、指针?函数?傻傻分不清楚二、指针函数闪亮登场三、抽丝剥茧:解析指针函数四、实例讲解:指针函数的应用五、总结拨开迷雾:深入浅出C语言指针函数    指针,一直是C语言学习路上的「拦路虎」,而指针函数更是让许多初学者望而却......
  • 从零开始学习嵌入式----C语言函数指针
    C语言的函数指针:从入门到深入理解    函数指针是C语言中一个强大且灵活的特性,它允许我们将函数作为参数传递给其他函数,或者将函数存储在数据结构中。正确理解和使用函数指针可以帮助我们编写更加模块化、高效和可扩展的代码。一、什么是函数指针?    在C......
  • 帝国CMS网站提示信息函数1
    提示信息函数1语法:printerror($error,$gotourl,$ecms,$noautourl,$novar)说明:$error:提示信息内容,可以为语言包变量,也可以直接提示内容。$gotourl:提示信息转向链接地址$ecms:0为后台提示信息、1为前台提示信息、8为后台提示信息(alert方式)、9为前台提示信息(alert方式)$noautourl:0......
  • TS定义数组 ts声明函数
    ts定义数组//定义整数型数组constarr1:number[]=[]constarr1_1:Array<number>=[]//定义字符窜型数组constarr2:string[]=[]constarr2_1:Array<string>=[]//定义对象型数组constarr3:object[]=[]constarr3_1:Array<Object>......
  • Lingo学习(三)——工厂合并、运算符、内置函数
    一、工厂合并(一)工厂合并——生产二维矩阵【引入】sets:                                factory/1..6/:a;                  plant/1..8/:d;                    Cooperation(fact......