Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/377.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用Ruby'不正确吗;s arr.inject(:+;)或JavaScript';s arr.reduce((a,b)=>;{返回a+;b})来对数字数组求和?_Javascript_Ruby_Reduce_Inject - Fatal编程技术网

使用Ruby'不正确吗;s arr.inject(:+;)或JavaScript';s arr.reduce((a,b)=>;{返回a+;b})来对数字数组求和?

使用Ruby'不正确吗;s arr.inject(:+;)或JavaScript';s arr.reduce((a,b)=>;{返回a+;b})来对数字数组求和?,javascript,ruby,reduce,inject,Javascript,Ruby,Reduce,Inject,我以前认为鲁比 arr.inject(:+) 还是JavaScript的 arr.reduce((a, b) => { return a + b }) // a cooler way arr.reduce( (a, b) => a + b ) 两者都相当于对数组项求和。但是,由于这样一种情况,它实际上是不正确的:如果数组是空的呢 Ruby将返回nil,JavaScript将引发异常。因此,除了使用初始值,还有更好的方法吗?要处理空数组引发的异常,请声明初始值 var ar

我以前认为鲁比

arr.inject(:+)
还是JavaScript的

arr.reduce((a, b) => { return a + b })

// a cooler way
arr.reduce( (a, b) => a + b )  
两者都相当于对数组项求和。但是,由于这样一种情况,它实际上是不正确的:如果数组是空的呢


Ruby将返回
nil
,JavaScript将引发异常。因此,除了使用初始值,还有更好的方法吗?

要处理空数组引发的异常,请声明初始值

var arr=[],
res=arr.reduce((a,b)=>{returna+b},0);
//^^初始值

控制台日志(res)若要处理空数组引发的异常,请声明初始值

var arr=[],
res=arr.reduce((a,b)=>{returna+b},0);
//^^初始值
控制台日志(res)Ruby可以接受两个参数,第一个是初始值。如果可枚举的
中没有元素,则此初始值将成为返回值:

[].inject(:+)
# nil
[].inject(0,:+)
# 0
正如@Ursus在评论中提到的,Ruby 2.4使用默认值
0

[].sum
# 0
另外,对于某些对象(),它的速度也快得多

请注意,返回
nil
有时可能是期望的结果,具体取决于后面的进程

最后,当数组为空且未定义默认值时,JS值得称赞。这可能是最干净的解决方案。

Ruby可以接受两个参数,第一个是初始值。如果可枚举的
中没有元素,则此初始值将成为返回值:

[].inject(:+)
# nil
[].inject(0,:+)
# 0
正如@Ursus在评论中提到的,Ruby 2.4使用默认值
0

[].sum
# 0
另外,对于某些对象(),它的速度也快得多

请注意,返回
nil
有时可能是期望的结果,具体取决于后面的进程


最后,当数组为空且未定义默认值时,JS值得称赞。这可能是最干净的解决方案。

仅仅因为您使用带有隐式类型的动态类型语言,并不意味着您不必考虑类型

在其他语言中,这两个操作有不同的名称(例如在Haskell和Scala和中),而在Ruby中,它们是重载的,但问题仍然是它们是两个不同的操作:

  • 常规
    折叠操作

    • a
      s的集合进行操作
    • 具有类型为
      B
    • 以及一个组合函数,它接受a
      B
      和a
      a
      并返回a
      B
    也就是说

    • 它可以返回元素类型以外的类型的对象(它返回的是
      B
      ,而不是
      a
    • 它可以对空集合进行操作
  • 受约束的
    reduce
    操作

    • a
      s的集合进行操作
    • 没有零元素,它使用集合的一个元素,其类型为
      A
    • 以及一个组合函数,它接受
      a
      a
      ,并返回
      a
    也就是说

    • 它只能返回与元素类型相同类型的对象(它返回
      A
    • 它只能对非空集合进行操作
  • 这也是Haskell名称的来源,它被称为
    foldl1
    ,因为它至少需要1个元素,并且以元素编号1作为初始元素

    请注意,常规的
    折叠
    操作严格来说比受约束的
    减少
    操作更强大。事实上,一般的
    折叠
    操作是一个,它可以做
    foreach
    循环可以做的任何事情:
    映射
    分组
    排序
    uniq
    反向
    ,…你可以这么说。每个收集操作都可以实现为折叠

    例如:

    模块可枚举
    反方向
    注入([]){| acc,el |[el]+acc}
    结束
    #这并不完全相同,因为它并不懒惰
    我的名字是什么?
    注入(假){| acc,el | acc |屈服el}
    结束
    结束
    

    reduce
    不是万能的。例如,不能使用
    reduce
    实现
    reverse
    ,因为
    reduce
    返回
    A
    ,但
    reverse
    返回
    集合;但是,这仅适用于元素求和的特定情况,但例如,不适用于将元素相乘的实际相同问题。

    仅仅因为您使用具有隐式类型的动态类型语言,并不意味着您不必考虑类型

    在其他语言中,这两个操作有不同的名称(例如在Haskell和Scala和中),而在Ruby中,它们是重载的,但问题仍然是它们是两个不同的操作:

  • 常规
    折叠操作

    • a
      s的集合进行操作
    • 具有类型为
      B
    • 以及一个组合函数,它接受a
      B
      和a
      a
      并返回a
      B
    也就是说

    • 它可以返回元素类型以外的类型的对象(它返回的是
      B
      ,而不是
      a
    • 它可以对空集合进行操作
  • 受约束的
    reduce
    操作

    • a
      s的集合进行操作
    • 没有零元素,它使用集合的一个元素,其类型为
      A
    • 以及一个组合函数,该组合函数采用
      a
      a
      和re