变量名和逗号后的下划线有啥作用?

Posted

技术标签:

【中文标题】变量名和逗号后的下划线有啥作用?【英文标题】:What is the purpose of the underscore after variable name and comma?变量名和逗号后的下划线有什么作用? 【发布时间】:2021-08-11 14:15:42 【问题描述】:

我找到了这个 Lua 代码:

function displayName(name)
  name, _ = name:gsub("", "\\")
  return name
end

又一次:

function parsePath(path)
  if type(path) == "string" then path, _ = path:gsub("\\", "/") end
  return path
end

我了解代码的作用.. 我不明白的是,变量名和赋值部分 (=) 之间的 _(逗号下划线).. 所以这个 name, _ = name:gsub("", "\\") 和这个 ..then path, _ = path:gsub("\\", "/")

谁能给我解释一下那个东西的意思?

不会是 name = name:gsub(....)..then path = path:gsub(...) 一样吗?

那么为什么要这样写脚本呢?

【问题讨论】:

以这种方式使用下划线来表示必须定义的未使用变量是许多编程语言中常见的programming idiom 【参考方案1】:

在许多编程语言中,_ 用于表示未使用的变量。

这也适用于 Lua。这是纯粹的风格约定。你不会在 Lua 手册中找到任何关于它的内容。

luackeck,最常见的 Lua 静态代码分析器会在代码中有未使用的变量时发出警告。在这方面,它将忽略名为 _ 的变量。

不会是 name = name:gsub(....) 或 ..then path = path:gsub(...) 的 一样吗?

在您的示例中,这实际上是不必要的。

name, _ = name:gsub("", "\\") 中有_ 的唯一原因是提示该函数实际上返回两个值。通常你会离开_

而如果您只对第二个返回值感兴趣,_, numReplaced = name:gsub("", "\\") 会很有意义。如果不添加第一个未使用的变量,您将无法获得它。

【讨论】:

感谢您的回复和解释。那么您是否确认在这两部分代码中逗号/下划线没有意义并且可以删除? (嗯......也许最初的功能是不同的并返回更多的值......这是一个遗留物) 好吧,除非你想提示 string.gsub 实际上有 2 个返回值,你只使用第一个,否则在这里使用下划线是没有意义的。来自 Lua 手册:“在赋值之前,将值列表调整为变量列表的长度。如果值多于需要,则丢弃多余的值。”因此,如果您只提供一个变量,则函数返回的列表将调整为 1 个元素。 再次感谢您。现在我明白了那部分代码的含义。由于 string.gsub 返回 2 个值 ..(我们只对第一个感兴趣)两种语法的工作方式相同。一个更简单,更清晰(没有逗号下划线),另一个更精确,并提供有关被调用字符串函数如何工作的提示。 理想情况下,您知道该函数的作用,如果不知道,请检查参考并找出答案。我个人更喜欢只在必要的地方使用 _。 我完全同意你的观点:我也更喜欢更干净、更易读的代码。【参考方案2】:

我不是 Lua 专家,但这种模式在 Python 等其他编程语言中也有使用。下划线的意思是“一个不会被使用的变量”。如果你的函数返回一个包含两个元素的数组,那么你需要这样做,否则你会得到整个数组。

【讨论】:

是的..我了解了它..例如,当索引的值不相关时,在 for 循环中使用下划线变量。令我困惑的是,在我发布的代码中使用它似乎没有任何目的,因为它只是获得与实际变量相同的值,即返回的那个..

以上是关于变量名和逗号后的下划线有啥作用?的主要内容,如果未能解决你的问题,请参考以下文章

C语言里面的点.运算符有啥作用表示啥还有下划线

shell 变量介绍

Shell 变量

Shell 变量

Shell变量

2-shell变量