【问题标题】:Are args and args[..] the same?args 和 args[..] 是一样的吗?
【发布时间】:2013-02-19 12:44:47
【问题描述】:

我正在阅读optparse.coffee,但对以下行感到困惑:

args = args[..]

那条线有什么作用?

【问题讨论】:

    标签: arrays coffeescript


    【解决方案1】:

    来自fine manual

    数组切片和范围拼接

    范围也可用于提取数组切片。有两个点 (3..6),范围包括在内 (3, 4, 5, 6);带有三个点 (3...6),范围不包括结尾 (3, 4, 5)。切片索引具有有用的默认值。省略的第一个索引默认为零,省略的第二个索引默认为数组的大小。

    所以说array[..] 是:

    len = array.length
    array[0 .. len]
    

    这只是对array 的浅拷贝。这意味着args = args[..] 只是制作了args 的本地浅拷贝,这样args 就可以在不改变传入的原始数组的情况下进行操作和更改,并且您可以存储对数组的引用而无需函数调用者能够通过传递给函数的原始 args 引用意外更改了您的数组。

    考虑这个简化的例子:

    f = (args) -> args = args[..]
    

    这就变成了这个 JavaScript:

    var f;
    
    f = function(args) {
      return args = args.slice(0);
    };
    

    还有Array#slice

    返回数组的一部分的浅拷贝。
    [...]
    如果省略end,则切片提取到序列的末尾。

    所以说array.slice(n) 返回array 的浅表副本,从索引narray 的末尾,并且由于数组的索引从零开始,array.slice(0) 制作了整个索引的浅表副本数组。

    【讨论】:

      猜你喜欢
      • 2011-08-25
      • 1970-01-01
      • 1970-01-01
      • 2013-09-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-09-06
      • 1970-01-01
      相关资源
      最近更新 更多