zoukankan      html  css  js  c++  java
  • lua "诡异"的return用法

    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 进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容。
  • 相关阅读:
    mysql用户授权及数据备份恢复
    mysql数据库导入导出 查询 修改表记录
    mysql数据库 索引 事务和事务回滚
    mysql数据库基本使用(增删改查)
    B-Tree 和 B+Tree
    网络七层模型及TCP、UDP,一次HTTP请求都发生了什么
    堆排、python实现堆排
    Linux 文件系统
    现有n 个乱序数,都大于 1000 ,让取排行榜前十,时间复杂度为o(n), top10, 或者 topK,应用场景榜单Top:10,堆实现Top k
    Ajax 基础
  • 原文地址:https://www.cnblogs.com/sanyejun/p/7912111.html
Copyright © 2011-2022 走看看