这是基准require'benchmark'#createrandomarrayarr=40000.times.map{rand(100000).to_s}r1=''r2=''r3=''Benchmark.bmdo|x|x.report{r1=(arr.map{|s|"[#{s}]"}).join}x.report{r2=arr.inject(''){|memo,s|memo+"[#{s}]"}}x.report{r3=''arr.each{|s|r3这是结果usersystemtotalreal0.0470000.0000000.047000(0.046875)5.0310000.8
有关联OrderItem的模型Order。我需要计算订单的成本,为此我使用了以下代码:order_items.inject{|sum,oi|sum+=oi.value}但结果我得到了OrderItem对象,而不是Fixnum或其他东西。我做错了什么? 最佳答案 除非您将初始值传递给Enumerable#inject,使用集合的第一项(在您的情况下为OrderItem)。;OrderItem+=OrderItem#value根据您的问题返回OrderItem。尝试以下操作(将初始值显式传递为Fixnum0):order_items.i
具有以下数组和值:v=50a=[10,20,25,10,15]我想遍历数组,将值相加,直到这些值的总和超过变量v。然后我希望能够返回数组中发生这种情况的索引。所以...10+20+25=55(这是总和大于“v”的第一个点)所以指数=2谢谢你的帮助 最佳答案 总和:a.injectdo|sum,n|breaksumifsum>vsum+nend对于索引,思路是一样的——将备忘录用作数组,并将总和保存在第一个元素中:a.inject([0,-1])do|memo,n|break[memo[0],memo[1]]ifmemo[0]>v[m
我在练习ruby注入(inject)方法时发现了一个奇怪的输出:defadding(*num)res=num.inject{|sum,n|sum+n}puts"sum:::::::::::::::::::#{res.inspect}"puts"sum:::::::::::::::::::#{res.class}"endadding([1,2,3,4,5])输出:sum:::::::::::::::::::[1,2,3,4,5]sum:::::::::::::::::::Array当我们这样做的时候:[1,2,3,4,5].inject{|sum,n|sum+n}输出:15为什么会出
一段时间以来,我一直在绞尽脑汁。当使用reduce时-为什么返回第一个元素而不执行block中定义的操作?还是我错过了减少工作原理的关键点?在下面的例子中:arr=[1,3,5]arr.reduce{|sum,n|sum+(n*3)}#=>25我本以为结果是27。开始于:0+(1*3)=33+(3*3)=1212+(5*3)=27经过一段时间的尝试,我发现在第一个“滴答”中——数组中的对象只是被添加到总和而不是相乘。这样计算更像是:???=11+(3*3)=1010+(5*3)=25有人可以帮我弄清楚我在哪里偏离了道路吗? 最佳答案
我仍然是一个ruby新手,我正在尝试学习如何使用inject方法。通过使用inject方法,我试图返回一组字母及其在给定字符串中的外观,如下所示:defsorting(str)str.split("").uniq.map{|letter|[letter,str.split("").inject(0){|sum,char|sum+1ifletter==char}]}endpsorting("aaabdbbcccaaabcacba")期望的结果应该是:[["a",8],["b",5],["d",1],["c",5]]不幸的是,我收到一个错误:undefinedmethod'+'forn
看来我们总是可以使用&:+。为什么inject可以取:+而map必须取&:to_s?如果原因是map不能带符号而必须带block,那么map也带符号有意义吗?[1,3,5].inject(:+)#=>9[1,3,5].inject(&:+)#=>9[1,3,5].map(&:to_s)#=>["1","3","5"][1,3,5].map(:to_s)#=>ArgumentError:wrongnumberofarguments(1for0) 最佳答案 这是设计使然。inject允许使用替代语法来获取符号,而map始终需要一个blo
我永远不记得它是不是array.inject{|memo,obj|block}或array.inject{|obj,memo|block}有没有人有记住顺序的好技巧? 最佳答案 inject/reduce只不过是一个leftfold(因此在其他语言中称为foldl/foldLeft),就是这样,元素与二元运算符的递归left-associative组合:(1..5).reduce(:+)==(((1+2)+3)+4)+5#=>true(1..5).reduce(:-)==(((1-2)-3)-4)-5#=>true因此,累加器作为b
我正在尝试编译哈希列表中给定哈希键的所有值。我有以下有效的方法。[{'a':1,'b':2,'c':3},{'a':4,'b':5,'c':6},{'a':7,'b':8,'c':9}].inject({})do|hash,item|item.eachdo|key,value|hash[key]=[]ifhash[key].nil?hash[key]这是很棒的结果:{:a=>[1,4,7],:b=>[2,5,8],:c=>[3,6,9]}我的问题:是否有更优雅的方法来初始化散列,这样我就不需要检查下一行中的nil情况?hash[key]=[]ifhash[key].nil?我已经尝试将
我需要在父类的每个子类中注入(inject)回调。因此,必须先调用带有回调的方法,然后再调用所有存在的链:可以实现思想别名方法(或别名方法链):moduleChildMod1defsaveputs"saveChildMod1"superendendmoduleChildMod2defsaveputs"saveChildMod2"superendendclassParentdefsaveputs"saveParent"endendclassChild输出saveCallbacksaveChildsaveChildMod2saveChildMod1saveParent但是有没有可能通过继承