https://yq.aliyun.com/articles/11387

lua "诡异"的return用法

 

德哥 2016-03-29 15:38:42 浏览5690 评论0

摘要: 在Lua中, return的用法比较"诡异", 为什么这么说呢, 因为它只能用在block结束的地方, 不能用在block的一个中间部分.例如function a() i = 1 return i -- 这里会报错, 提示return后面必须是end, 意思是既然你要return了, 那么就结束这个块吧.

在Lua中, return的用法比较"诡异", 为什么这么说呢, 因为它只能用在block结束的地方, 不能用在block的一个中间部分.

例如

function a()
i = 1
return i -- 这里会报错, 提示return后面必须是end, 意思是既然你要return了, 那么就结束这个块吧.
i = 2
end

例如 :

> function a()
>> i = 1
>> return i
>> i = 2
stdin:4: 'end' expected (to close 'function' at line 1) near 'i'
那么如果要在一个函数或者一个block的非末尾部分使用return 怎么用呢?
可以把return 包在do end之间. 例如 :

> function a()
>> i = 1
>> do return i end -- 这里是允许的.
>> i = 2
>> end
> print(a())
1

另外, return在循环, 判断中的使用也和函数中类似, 必须使用在循环结束, 或者判断的一个拐点结束前. 例如 :

> if i == 1
>> then
>> return -- 这里不能使用, 因为下面不是elseif或者else或者end.
>> i=2
stdin:4: 'end' expected (to close 'if' at line 1) near '='

所以在判断中, 放在一个拐点结束前 :

if i == 1
then
return
elseif i == 2
then
return
else
return
end
-- 以上用法是可以的, return分别放在elseif, else, end前面. 拐点 结束前.
在循环中使用则放在循环结束前.
但是你会发现, 如果结束处用的是一个print函数, 居然不报错 :

> for x=1,10,1 do
>> print(x)
>> return
>> print(x+1)
>> end
1
2

return后面换成赋值就报错了

> for x=1,10,1 do
print(x)
return
print(x+1)
x=2
stdin:4: 'end' expected (to close 'for' at line 1) near 'x'
> for x=1,10,1 do
print(x)
return
x=2
stdin:4: 'end' expected (to close 'for' at line 1) near '='
"诡异"来形容不为过.
还是得把return包在一个do end里面

> for x=1,10,1 do
print(x)
do return end
print(x)
x=2
>> end
1

用在repeat中

> repeat do
i=1
print(i)
return
print(i)
end until i == 2
1
1
> repeat do
i=1
print(i)
return
print(i)
x=2 -- 这里又会报错.
end until i == 2
stdin:4: 'end' expected (to close 'do' at line 1) near 'x'
本文为云栖社区原创内容,未经允许不得转载,如需转载请发送邮件至yqeditor@list.alibaba-inc.com;如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件至:yqgroup@service.aliyun.com 进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容。

lua "诡异"的return用法的更多相关文章

  1. C#中yield return用法分析

    这篇文章主要介绍了C#中yield return用法,对比使用yield return与不使用yield return的流程,更直观的分析了yield return的用法,需要的朋友可以参考下. 本文 ...

  2. C# yield return 用法与解析

    原文:C# yield return 用法与解析 C# yield return 用法与解析 本文参考自:http://www.jb51.net/article/54810.htm 当初没有认真理解 ...

  3. C# yield return用法

    本文实例讲述了C#中yield return用法,并且对比了使用yield return与不使用yield return的情况,以便读者更好的进行理解.具体如下: yield关键字用于遍历循环中,yi ...

  4. C#中的yield return用法演示源码

    下边代码段是关于C#中的yield return用法演示的代码. using System;using System.Collections;using System.Collections.Gene ...

  5. js 之 continue break return 用法及注意事项

    1,continue continue有两种用法: 1,continue; 这种用法必须包含在循环里,否则报错,例子: for(var i=0;i<10;i++){ if(i%2===0){ c ...

  6. 【转】C#中continue、break和return用法

    continue和break的用法一样,直接写上这个单词,后面加一个分号就行 比如: continue; break; 我们先来谈continue 看代码 for (int i=0; i<10; ...

  7. Break、continue、return用法(C++)

    (1)break 直接调出当前循环体.如果是嵌套循环,他只能调出一层循环体. Exp-1: 程序: #include<iostream> using namespace std; int ...

  8. Java-break,continue,return用法

    当年的我也算是基础小王子,但是长时间的不用导致我与他们越来越陌生了,所以我要把他们记在我的本本上. 首先我们要明白,java中到底有多少个循环关键字? 答:没错,就是3个,他们分别是:for(初始值: ...

  9. html、text、val、attr、prop区别。this.value和$(this).val()区别以及return用法

    html(): html() 方法返回或设置被选元素的内容 (inner HTML). 当使用该方法读取多个值时,它会返回第一个匹配元素的内容. 当使用该方法设置一个值时,它会覆盖所有匹配元素的内容. ...

随机推荐

  1. jQuery插件扩展extend的实现原理

    相信每位前端的小伙伴对jQuery都不陌生吧,它最大的魅力之一就是有大量的插件,去帮助我们更轻松的实现各种功能. 前几天晚上,闲来无事,就自己动手写了个简单的jQuery插件,功能很简单,只是让选定的 ...

  2. c#帮助类:发送邮件

    private static string IsOpenSendMail = ConfigurationManager.AppSettings["IsOpenSendMail"]; ...

  3. C语言中无符号与有符号问题

    unsigned char a[5] = { 12,36,96,128,182 }; a[]范围为0~256. 数组中数都有效. char a[5] = { 12,36,96,128,182 }; a ...

  4. (c++11)随机数------c++程序设计原理与实践(进阶篇)

    随机数既是一个实用工具,也是一个数学问题,它高度复杂,这与它在现实世界中的重要性是相匹配的.在此我们只讨论随机数哦最基本的内容,这些内容可用于简单的测试和仿真.在<random>中,标准库 ...

  5. 类与类之间的两种关系------新标准c++程序设计

    在c++中,类和类之间有两种基本关系:复合关系和继承关系. 复合关系也称为“has a”关系或“有”的关系,表现为封闭类,即一个类以另一个类的对象作为成员变量. 继承关系也称为“is a”关系或“是” ...

  6. 强制所有网页链接在同一页面打开或者在TabControl中弹出新窗口

    IEwebbrowser中老生常谈的话题. 一般的解决都是通过 // webBrowser.Navigating += WebBrowser_Navigating; 注册转跳前事件 private v ...

  7. IO模型《二》阻塞IO

    阻塞IO(blocking IO) 在linux中,默认情况下所有的socket都是blocking,一个典型的读操作流程大概是这样: 当用户进程调用了recvfrom这个系统调用,kernel就开始 ...

  8. F - ACboy needs your help again! (模拟)

    ACboy was kidnapped!! he miss his mother very much and is very scare now.You can't image how dark th ...

  9. 【BlockingQueue】BlockingQueue 阻塞队列实现

    前言: 在新增的Concurrent包中,BlockingQueue很好的解决了多线程中,如何高效安全“传输”数据的问题.通过这些高效并且线程安全的队列类,为我们快速搭建高质量的多线程程序带来极大的便 ...

  10. request对象常用方法

    String getParameter(String name)根据表单组件名称获取提交数据 Sring[] getParameterValues(String name)获取表单组件对应多个值时的请 ...