【1】Lua函数,默认实参

习惯了其他语言(如C++)的默认实参,利用Lua语言的过程中,发现没有默认实参这种机制。

所以,自己模拟了一个满足业务需求的带默认实参的函数。

(1)示例如下:

 local function func(arg1, arg2)

     if nil == arg2 then
arg2 = true
end if arg1 then
print('arg1 value : ' .. arg1)
else
print('arg1 is false or nil')
end if arg2 then
print('arg2 value : ' .. (type(arg2) == 'boolean' and 'true' or arg2) .. '\n')
else
print('arg2 value : false\n')
end end -- test
func('')
func('', 'abc')
func('lua', false)
func('web', true)
-- func(,true)
func('study') --[[
arg1 value : 123
arg2 value : true arg1 value : 456
arg2 value : abc arg1 value : lua
arg2 value : false arg1 value : web
arg2 value : true arg1 value : study
arg2 value : true
--]]

(2)分析过程:

如果调用函数时,如果没有实参值,lua语言会认为这个实参值为nil。

利用Lua语言的这一特性,可以模拟实现默认实参函数。

2.1 如上22行

对func的调用时,没有为第二个参数arg2赋值,遵循Lua语言的语法,说明第二个参数的值为nil。

在函数内部对nil值进行判断,若没有赋实参值,估可以认为欲利用默认实参值,将默认实参值赋值于参数2即可。

2.2 如上24行

对func的调用时,为第二个参数arg2赋值false,遵循Lua语言的语法,说明第二个参数的值为false。

在函数内部对nil值进行判断,既然已赋实参值,那么肯定不是nil,其他逻辑直接使用实参值即可。

2.3 如上25行,与24行同理。

2.4 如上26行,不允许此种写法!说明Lua语言同其他语言一致,遵循同样的原则,如果参数有”默认实参值“,只允许从最后的参数赋值。

若不理解此条,可以学习一下C++语言的默认实参机制。可参见随笔《为什么C++函数的形参默认值从最末一个赋值?

2.5 如上27行,与22行同理。

(3)总结:

穷则思,思则变,变则通,通则达。

Good Good Study, Day Day Up.

顺序 选择 循环 总结

Lua 函数参数 & 默认实参的更多相关文章

  1. 【C#基础概念】函数参数默认值和指定传参和方法参数

    函数参数默认值和指定传参 最近在编写代码时发现介绍C#参数默认值不能像PL/SQL那样直接设置default,网上也没有太多详细的资料,自己琢磨并试验后整理成果如下: C#允许在函数声明部分定义默认值 ...

  2. Python函数参数默认值的陷阱和原理深究"

    本文将介绍使用mutable对象作为Python函数参数默认值潜在的危害,以及其实现原理和设计目的 本博客已经迁移至: http://cenalulu.github.io/ 本篇博文已经迁移,阅读全文 ...

  3. java函数参数默认值

    java函数参数默认值 今天,需要设定java函数参数的默认值,发现按照其它语言中的方法行不通 java中似乎只能通过函数的重载来实现 函数参数默认代码

  4. ES6学习 --函数参数默认值与解构赋值默认值

    1. ES6的解构ES6中引入了解构赋值的操作,其作用是:将值从数组Array或属性从对象Object提取到不同的变量中 即分为两种情况:从数组Array中解构,以及从对象Object中解构 ①.从数 ...

  5. Python函数参数默认值的陷阱和原理深究(转)

    add by zhj: 在Python文档中清楚的说明了默认参数是怎么工作的,如下 "Default parameter values are evaluated when the func ...

  6. ES6函数参数默认值作用域的模拟原理实现与个人的一些推测

    一.函数参数默认值中模糊的独立作用域 我在ES6入门学习函数拓展这一篇博客中有记录,当函数的参数使用默认值时,参数会在初始化过程中产生一个独立的作用域,初始化完成作用域会消失:如果不使用参数默认值,不 ...

  7. ES6 - 函数扩展(函数参数默认值)

    函数参数默认值 ES6 之前,不能直接为函数的参数指定默认值,只能采用变通的方法. function log(x, y) { y = y || 'World'; console.log(x, y); ...

  8. c++中函数的参数传递,内联函数和默认实参的理解

    1.参数传递 1)函数调用时,c++中有三种传递方法:值传递.指针传递.引用传递. 给函数传递参数,遵循变量初始化规则.非引用类型的形参一相应的实参的副本初始化.对(非引用)形参的任何修改仅作用域局部 ...

  9. ES6 学习笔记之三 函数参数默认值

    定义函数时为参数指定默认值的能力,是现代动态编程语言的标配.在ES6出现之前,JavaScript是没有这种能力的,框架为了实现参数默认值,用了很多技巧. ES6 的默认参数值功能,与其他语言的语法类 ...

随机推荐

  1. [jzoj]3456.【NOIP2013模拟联考3】恭介的法则(rule)

    Link https://jzoj.net/senior/#main/show/3456 Description 终于,在众亲们的奋斗下,最终boss 恭介被关进了库特设计的密室.正当她们松了一口气时 ...

  2. react中constructor()和super()的具体含义以及如何使用

    1.constructor()---super( )的基本含义 constructor()--构造方法 这是ES6对类的默认方法,通过new命令生成对象实例时自动调用该方法.并且,该方法是类中必须有的 ...

  3. 取消Fragment切换时间,Fragment+ViewPager静止滑动,去掉默认的滑动效果

    import android.content.Context; import android.support.v4.view.ViewPager; import android.util.Attrib ...

  4. 2018-2019-2 20165311《网络对抗技术》Exp5 MSF基础应用

    <网络对抗技术>Exp5 MSF基础应用 实验目的 实验内容 一个主动攻击实践(ms08_067) 一个针对浏览器的攻击(ms11_050) 一个针对客户端的攻击(adobe_toolbu ...

  5. 【Python基础】lpthw - Exercise 41 学习面向对象术语

    一.专有词汇 类(class):告诉python创建新类型的东西. 对象(object):两个意思,即最基本的东西,或者某样东西的实例. 实例(instance):让python创建一个类时得到的东西 ...

  6. 20175303 2018-2019-2 《Java程序设计》第7周学习总结

    20175303 2018-2019-2 <Java程序设计>第7周学习总结 教材学习内容总结 1.String类: Java专门提供了用来处理字符序列的String类 构造String对 ...

  7. [Day24]IO(转换流、缓冲流)

    1. 转换流 1.1 OutputStreamWriter类-字符流通向字节流的桥梁,可使用指定的字符编码表,将要写入流中的字符编码成字节. 1.2 InputStreamReader类-字节流通向字 ...

  8. 学习ActiveMQ(五):activemq的五种消息类型和三种监听器类型

    一.前面我们一直发送的是字符串类型,其实activemq一共支持五种消息类型: 1.String消息类型:发送者:消费者: 1.String消息类型:发送者:消费者: 1.String消息类型:发送者 ...

  9. linux自定义开机自启多个服务的脚本

    linux服务器重启后,每次要启动redis.ftp.tomcat等应用总是很麻烦,于是写了一个自定义脚本,在开机或重启的时候,自动启动多个服务.应用. 很简单,写脚本.设置开机启动.   第一步.准 ...

  10. Eclipse集成Hadoop插件

    一.Eclipse集成Hadoop插件 1.在这之前我们需要配置真机上的hadoop环境变量 注:在解压tar包的时候普通解压会出现缺文件的现象,所以在这里我们需要用管理员的方式启动我们的解压软件(我 ...