2017-01-02 48 views
2

在某些源代码中,我看到“Underscore.lua”模块的用法。Lua中的Underscore.lua模块的用途是什么?

_ = require 'underscore' 

的描述说以下内容:

Underscore.lua是一个Lua库,用于处理迭代,阵列,表和功能提供效用的一组 功能。 它的API和文档受到Underscore.js的启发。 它是地道的在Lua使用下划线字符扔掉变量,所以你可以简单地把它分配给另一个变量名称...

在文档中提供的例子是有点混乱给我。例如,以下操作的目的是什么?

_ = require 'underscore' 
_.each({1,2,3}, print) 

1 1 { 
    1 : 1 
    2 : 2 
    3 : 3 
} 
2 2 { 
    1 : 1 
    2 : 2 
    3 : 3 
} 
3 3 { 
    1 : 1 
    2 : 2 
    3 : 3 
} 

很显然,这个模块提供了一些功能迭代器,阵列等,但为什么要用_时,你可以使用任何其他字符不是下划线更加明显?特别是当许多编辑没有突出显示它时,阅读起来非常麻烦。我不太明白什么是大惊小怪。

+3

是的,Lua允许莫尔斯风格的编程:'_.__:_()'由于下划线字符在Lua标识符中非常有效。 –

回答

4

但是,为什么在使用_时只能使用比下划线更明显的任何其他字符?

*啊哈*:

深受Underscore.js

启发

因为那是用什么Underscore.js

我宁可怀疑下划线字符是精确选择的,因为它不是非常明显。这些实用程序的重点在于,您可以在任何地方使用它们,这是您日常的基本操作数据结构所需的东西。

因此,它们应该看起来是语言中可用的标准函数,只需最少的语法来访问它们。但是你不能将它们转储到全局表/命名空间/ etc中;这可能与现有代码相冲突。所以你给他们访问它们所需的语法的绝对最小值。

+1

根据我的理解,[它非常习惯](http://lua-users.org/wiki/LuaStyleGuide)在被忽略的循环中为变量使用下划线,就像'for _,v in ipairs(t)打印(v)结束。因此,IMO的下划线在这里不是一个非常安全的选择。 –

+0

@ThomasW:Lua可能会出现这种情况,但是又是下划线。 *** *** JS。 –

+0

这当然是对的,但我们在这里讨论的是一个Lua模块,尽管它被命名为“下划线”,但我可能更愿意以不同的名称加载它。 –

3

如果使用

your_favorite_variable = require 'underscore' 

可以使用

your_favorite_variable.each({1,2,3}, print) 

但下划线(除了它具有相同的名称库和引用的JavaScript库)有以下几个优点:

  • 简单快捷。因此,当你需要它时很方便
  • 不可见。如果要将其视为“标准”库的一部分,则不希望将其视为可见。

这是相当常见的方法。类似的用于Javascript中的jQuery,它以相同的方式滥用$