为什么在 Lua 中使用 do-end 块?

2024-01-14

我一直试图寻找这个问题的答案,但未能成功。我想知道,do-end 块实际上是用来做什么的?它只是说在我的书中需要时使用值,那么我该如何使用它呢?

我是否可以通过将函数放置在 do-end 循环中并将局部变量放置在函数外部但在此 do-end 块内并且变量将被函数看到来使用它来减少局部变量的范围?那么这个函数还能被调用吗?

抱歉说得很含糊。我希望这是有道理的。也许一个插图示例可能有用^^


do-end 块与变量作用域问题有关。本质上,当您使用标识符时,它有什么价值?例如,当我们编写以下程序时,会打印哪些数字?

local x = 10
if x > 0 then
    local x = 17
    print(x)
end
print(x)

当涉及到局部变量时,Lua 使用标准的词法作用域,正如在第 4.2 节 http://www.lua.org/pil/4.2.html《Lua 编程》一书中的内容。词法作用域非常有用,原因如下:

  • 变量作用域是静态的。只需查看源代码,您就知道代码中的每个标识符对应哪些变量和函数。这与 Bash 中的动态作用域或通过方法调用或数组查找进行间接分派相反,在 Bash 中,您需要考虑程序的执行流程才能知道最终会得到什么值。

  • 变量作用域是有限的,这有助于提高可读性并避免一些错误:

    • 如果仅在需要使用变量时才声明该变量,则可以同时声明它并初始化它。另一方面,如果您在函数顶部声明所有变量,那么您可能会在初始化之前意外地使用其中一个变量。

    • 如果您在内部作用域内定义变量,则不会意外地在外部作用域中使用它。

  • 词法作用域使一些非常有表现力的习语 http://www.lua.org/pil/6.1.html当你将它与嵌套函数(闭包)结合起来时。

通常,您不需要担心自己指定变量范围。函数、循环和条件自动引入新的作用域,这通常足以为您的变量提供良好的约束作用域。也就是说,每隔一段时间,您可能想凭空引入一些额外的范围,我们可以使用 do-end 来实现这一点。 Lua 编程有以下示例,您要计算二次方程的解,并且计算有一些临时值:

do
  local a2 = 2*a
  local d = sqrt(b^2 - 4*a*c)
  x1 = (-b + d)/a2
  x2 = (-b - d)/a2
end          -- scope of `a2' and `d' ends here
print(x1, x2)

没有 do-end 块,a2 and d在不再需要它们后可能会被意外使用:

local a2 = 2*a
local d = sqrt(b^2 - 4*a*c)
x1 = (-b + d)/a2
x2 = (-b - d)/a2
print(x1, x2)

print(a2) -- OOPS! I wanted to say "print(a)"

也就是说,do-end 不需要经常使用。如果代码块较小,则隐藏局部变量的需要较少,如果代码块较大,则将代码块放入其自己的子例程中通常是更好的方法。我发现 do-end 闪耀的时候是当你只需要进行一次计算时 - 函数可能会被调用多次,但如果你使用 do-end 块,你会清楚地知道你只运行那段代码一次。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

为什么在 Lua 中使用 do-end 块? 的相关文章

  • Lua中如何去除字符串中的空格?

    我想从 Lua 中的字符串中删除所有空格 这是我尝试过的 string gsub str string gsub str string gsub str s 这似乎不起作用 如何删除所有空格 它有效 您只需分配实际结果 返回值 使用以下变体
  • lua检查多个值是否相等

    我喜欢用 Roblox 制作游戏 并用 lua 编写代码 在编写游戏时 我发现自己经常问一个值是否等于另一个值 这可能会产生很长的代码行 并且可能非常重复 例如 如果 x ClassName 衬衫 或x ClassName 附件 或x Cl
  • 错误 main.lua:23:尝试索引 upvalue 'Menu' (布尔值)

    我正在尝试用 lua 和 love2d 制作一个主菜单 这是我第一次这样做 遗憾的是没有关于此事的教程 所以我自己尝试了一下 我一直遇到这个错误 我不知道如何解决它 请帮助 完整错误消息 错误main lua 23 尝试索引upvalue
  • Lua中运算符~=是什么意思?

    什么是 Lua中的运算符是什么意思 例如 在以下代码中 if x params then the is not equals 这在其他语言中是等价的
  • 覆盖 require 后调用 lua_getfield() 时崩溃

    这个问题与 Henri Menke 在这个问题中的回答相关 如何在 C 中获取预加载模块名称 https stackoverflow com questions 51510308 how to get preloaded module na
  • 独立的 JavaScript 块有什么用处吗?

    The 有关 JavaScript 块的 MDN 文章 https developer mozilla org en US docs Web JavaScript Reference Statements block给出这个例子 var x
  • 如何在表中表示 nil

    假设我想存储一个元素列表 包括一些零值 值的位置很重要 我需要表示列表中给定位置处不存在值 这里有一个问题 a 1 2 3 nil 4 for k v in ipairs a do print k v end print a 4 print
  • 如何使用循环将字符串连接成一个?

    有人可以帮我解决字符串连接问题吗 我从寄存器读取数据 它的函数 utf regAddr length 我得到带有十进制数字的表格 然后将其转换为十六进制并循环字符串 我需要将这些字符串连接成一个 Lua中没有像 这样的操作符 functio
  • 如何使用Lua脚本语言打开Web套接字?

    作为初学者 我想在基于 Linux 的服务器上使用 Lua 打开一个 Web 套接字 该服务器应允许 Android 客户端连接到它 你能给我一些用Lua打开网络套接字的示例代码吗 您两周前已经问过同样的问题并得到了回答 LUA 脚本 We
  • Lua 如何创建可用于变量的自定义函数?

    对于像 io close 这样的方法 你可以像这样使用它 file close 有没有办法创建一个像这样工作的自定义函数 您可以在变量上调用它 对我来说 我尝试使用它通过使用 string find 查找空格来将参数与文本文件分开 所以在文
  • Lua 中的内联条件(a == b ? "yes" : "no")?

    无论如何 Lua 中可以使用内联条件吗 Such as print blah a true blah nahblah Sure print blah a and blah or nahblah
  • corona sdk中拖动物理对象

    我尝试在场景中拖动重力 0 0 的动态主体 我有一个主体类型为动态的正方形 以及一个主体类型为静态的图像 但是当将方形拖动到图像上时 它会产生一点力 但是可以超出图像并传递到另一边 如图所示 这是我拖动正方形的代码 local functi
  • 如何在aerospike中获取ttl为-1的记录集?

    我在aerospike中有很多记录 我想获取ttl为 1的记录 请提供解决方案 只是为了澄清 设置TTL 为 1 https github com aerospike aerospike client go blob master docs
  • Lua-迭代嵌套表

    我已经学习 Lua 几个星期了 这一次又一次成为我的症结所在 我尝试阅读有关该主题的帖子和书籍 我使用 Lua 查询软件监控系统 Nimsoft 我的数据以表格形式返回给我 我不会发布整个输出 但这里有一个我认为可以描述结构的片段 表参考是
  • Kong - 验证上游 ssl(ssl_proxy 打开)

    我已经成功为 API 安装了 kong 网关 该 API 通过上游负载平衡到多个目标 应用程序服务器 现在 我有一个我的应用程序服务器的自签名证书 kong 和目标之间的 ssl 握手应该失败 我推断 kong 不验证上游证书 经过一些研究
  • 如何在Conky中实现一个基本的Lua功能?

    我正在尝试向我的 Conky 添加一个函数 该函数打印字符串的长度以用于调试目的 代码位于名为的文件内test lua 非常简单 function test word return string len word end 我这样加载它 在我
  • 作用域函数 apply/with/run/also/let:它们的名字从何而来?

    有很多博客文章 例如this https dzone com articles examining kotlins also apply let run and with intentions 关于标准库函数的用法apply with ru
  • VB6 - Lua 集成

    我想知道是否有人有任何集成 Lua 和 VB6 的技巧 我正在运行一个小型在线角色扮演游戏 添加一些脚本会很棒 嗯 这是可行的 我曾经为 Lua 5 0 2 做过 但找不到文件 在您拥有的选项中 您可以 将 Lua 封装在公开 Lua AP
  • 去掉尾随零和小数点

    使用 Lua 我将数字格式化为可变位数并去掉尾随零 小数点 例如 string format precision f value gsub 0 1 gsub 值的类型为数字 正数 负数 整数 小数 所以任务已经解决了 但出于美学 教育和性能
  • 如何在lua中获取shell脚本的返回码?

    我正在lua中执行一个脚本 os execute sh manager scripts update system sh f 我想获得脚本的输出 如果退出状态为 7 则返回 7 I tried local output os execute

随机推荐

  • Docker Swarm 无法与自定义覆盖网络上的其他节点通信

    我的集群中有4个节点 其中两个在香港 其他在美国 我在群中创建了 4 个服务 Service Location foo USA bar HK haha USA hehe HK 这些服务使用相同的覆盖网络 当我尝试时ping foo or p
  • 计算两个矩形之间的重叠面积

    我想计算红色和蓝色矩形之间的重叠区域 灰色区域 每个矩形由其四个角坐标定义 重叠面积的结果单位是单位正方形 我无法想象我该怎么做 任何有创意的评论将不胜感激 这种类型的交集很容易通过 最大值的最小值 和 最小值的最大值 的想法来完成 为了将
  • 将 byte[] 转换为数据 URI 的 Base64 字符串

    我知道这个问题可能已经被问过 10000 次了 但是 我似乎找不到这个问题的直接答案 我的数据库中存储了一个代表图像的 LOB 我从数据库获取该图像 我想通过 HTML IMG 标签将其显示在网页上 这不是我的首选解决方案 但在我找到更好的
  • 如何为具有动态应用程序 ID 的应用程序指定外部路径

    我在我的应用程序中使用 FileProvider 当我从应用程序中拍摄照片时存储在那里 我的应用程序也有一个不同的应用程序 ID 用于调试和发布版本 com rkmax myapp com rkmax myapp debug 我已经像这样定
  • @SpringBootTest 干扰 EclipseLink 动态编织

    我的公司正在使用 Spring Boot Spring MVC JPA 以及 EclipseLink 和动态编织来开发 Web 应用程序 我的任务是准备 UI 的实现和集成测试 使用 JUnit 和 SpringBootTest 启动应用程
  • 为什么 TimeZone.getTimeZone("MST") 方法与 getTimeZone("US/Mountain") 不同?

    TimeZone getTimeZone US Mountain and TimeZone getTimeZone MST 返回不同的结果 这个java类中的MST不代表 山区标准时间 吗 您不应使用简短的三个字母名称 MST 在Java中
  • 如何让 KendoUI Validator 忽略隐藏的表单元素?

    我正在尝试将 KendoUI Validator 与 ASP NET WebForms 项目一起使用 我有一个简单的页面 有许多输入 当然 ASP NET 也添加了一些隐藏的表单元素 我有以下问题 为什么 KendoUI 验证器不忽略隐藏的
  • 实现 JTree 工具提示的最佳方法?

    由于 JTree 和 TreeModel 不直接提供开箱即用的工具提示 您认为为 JTree 提供特定于项目的工具提示的最佳方式是什么 编辑 之后回答我自己的问题 Zarkonnen 感谢 getTooltipText 的想法 我发现了另一
  • C# 5.0 EBNF 语法

    我正在寻找 5 0 版编程语言 C 的 EBNF 语法 这个语法应该是机器可读的 所以我可以用这个 EBNF 语法做一些处理 直到现在我才发现Visual Studio的安装中包含了C 的语言规范文档 PROGRAMFILES x86 Mi
  • 是否可以将 Zeppelin 笔记与 git 集成?

    是否可以将 Zeppelin 笔记与 git 集成 人们可以设置存储库位置 但如何将其设置为远程 git 存储库 不过 此功能可在 Amazon EMR 上使用 是的 这是可能的 我使用以下方式 创建一个 github 存储库并推送所有笔记
  • HighCharts:如何将自定义颜色与渐变相结合

    一段时间以来 我正在玩饼图的着色 或者我得到了没有渐变的自定义颜色 或者带有渐变的默认颜色 我的颜色存储在 php 字段中 我想像这样加载colors 我的代码的实际状态是这样的 它显示带渐变的默认颜色 colors Highcharts
  • 通过 FCM 消息控制台在后台向我的 iOS 应用程序发送静默通知

    我想向我的 iOS 应用程序发送静默通知 为此我已在其中实现了 FCM 当应用程序在后台运行时 当应用程序从 FCM 收到通知时 我需要执行一些操作 为此 执行过程将进入调用的方法 void application UIApplicatio
  • 仅获取容器中 Azure blob 文件的所有名称?

    我想要容器中 Azure Blob 文件中的所有名称 出于某种目的 我发现了一些类似的问题 甚至在 stackoverflow com 上也发现了一个 获取容器中 Azure blob 文件的名称列表 https stackoverflow
  • 评估 ansible 条件中的返回码

    我正在致力于自动化一项需要将 最新版本的软件附加到文件的任务 我不希望它对同一版本多次执行此操作 它查看以下示例文件 var software releases new Array 4 3 0 4 4 0 4 5 0 4 7 0 4 8 0
  • 从数据表中读取值

    我有一个填充有 samo 数据 值的 DataTable 我想从 DataTable 读取数据并将其传递给字符串变量 我有这个代码 DataTable dr art line 2 ds Tables QuantityInIssueUnit
  • 对数字列表求和比使用 for 循环更快的方法?

    有没有一种方法可以比使用 for 循环更快地对数字列表进行求和 也许在 Python 库中 或者这真的只有多线程 矢量处理才能有效地完成吗 编辑 为了澄清 它可以是任何数字的列表 未排序 只是用户输入的 您可以使用 sum 对数组的值求和
  • CSS3 旋转 - Firefox 和 Safari 中的渲染问题

    我正在尝试使用 CSS3 属性 旋转 将简单的文本行旋转一定角度 精确1 5度 webkit transform rotate 1 5deg moz transform rotate 1 5deg ms transform rotate 1
  • Node-phantom 显示生成的 pdf 页数

    我在获取 phantomjs 中生成的 pdf 页数时遇到问题 基本上我将 phantomjs 与 nodejs 一起使用 我想在第 5 页中显示总页数 function generatePdf Load ejs template fs r
  • 将 List 转换为 List 的最快方法

    获取基元列表并将其转换为可为空的基元列表的最快方法是什么 例如 List
  • 为什么在 Lua 中使用 do-end 块?

    我一直试图寻找这个问题的答案 但未能成功 我想知道 do end 块实际上是用来做什么的 它只是说在我的书中需要时使用值 那么我该如何使用它呢 我是否可以通过将函数放置在 do end 循环中并将局部变量放置在函数外部但在此 do end