在很多情况下,我在互联网上看到了Enumerable的each方法示例:defeach(&block)@items.eachdo|item|block.call(item)endend为什么人们不使用这个:defeach(&block)@items.each(&block)end有什么区别吗? 最佳答案 其实我觉得下面这个版本更常见:defeach@items.each{|i|yieldi}end这相当于您的第一个代码示例。但是,此版本与您的第二个版本之间存在细微差别:classTestdefinitialize(items)@it
rubyEnumerable/Arrayfirst(n)和take(n)有什么区别?我依稀记得take与惰性评估有关,但我不知道如何使用它来做到这一点,也找不到任何有用的谷歌搜索或文档。“take”是一个很难用谷歌搜索的方法名称。first(n)和take(n)是documented完全相同,不是太有帮助。first→objornilfirst(n)→an_arrayReturnsthefirstelement,orthefirstnelements,oftheenumerable.Iftheenumerableisempty,thefirstformreturnsnil,andthe
为什么我不能调用Enumerable#reduce(sym)没有像下面这样的括号?>>[1,2,3].reduce:+?>虽然使用括号会导致:>>[1,2,3].reduce(:+)=>6我是不是不小心调用了Enumerable#reduce{|备忘录,对象|block}代替?此外,为什么会发生这种情况?>>[1,2,3].reduce&:+?>^C>>[1,2,3].reduce(&:+)=>6非常感谢! 最佳答案 这似乎是IRb解析器中的一个错误。如果您在Pry、命令行或文件中尝试它,它工作得很好:ruby-e"res=[1,2
考虑对Enumerable的扩展:moduleEnumerabledefhash_onh={}eachdo|e|h[yield(e)]=eendhendend它是这样使用的:people=[{:name=>'fred',:age=>32},{:name=>'barney',:age=>42},]people_hash=people.hash_on{|person|person[:name]}ppeople_hash['fred']#=>{:age=>32,:name=>"fred"}ppeople_hash['barney']#=>{:age=>42,:name=>"barney"}是
我正在为一家ruby店的实习面试做准备。我期望的工作问题之一是重新实现一个可枚举的方法。我现在正在尝试实现map,但我无法弄清楚如何实现未给出block的情况。classArraydefmapp()out=[]ifblock_given?self.each{|e|outendoutendend使用我当前的实现。如果我运行:[1,2,3,4,5,6].mapp{|each|each+1}#returns=>[2,3,4,5,6,7]但是,我不确定如何获取未传入block的情况:[1,2,3,4].mapp("cat")#shouldreturn=>["cat","cat","cat","
那么我怎样才能写出漂亮的代码,例如:'imastringmeing!'.pop注意:str.chop不是充分的答案 最佳答案 这不是可枚举字符串实际枚举的内容。字符串是一系列......行,字符,代码点或字节数?答案是:所有这些、任何一个、其中之一或两者都不是,具体取决于上下文。因此,您必须告诉Ruby您实际需要哪些。String类中有几种方法可以返回上述任何一种的枚举数。如果您想要1.9之前的行为,您的代码示例将是'imastringmeing!'.bytes.to_a.pop这看起来有点难看,但这是有原因的:字符串是一个序列。您
我在Ruby中玩一些浮点舍入错误的玩具示例,我注意到以下行为让我感到惊讶。首先,一个不足为奇的例子,发生舍入错误的地方:numbers=Array.new(10,0.1)#=>[0.1,0.1,0.1,0.1,0.1,0.1,0.1,0.1,0.1,0.1]numbers.inject(0,:+)#=>0.9999999999999999现在尝试用Enumerable#sum做同样的事情:numbers.sum#=>1.0我在文档中唯一能找到的暗示解释的是summethodmaynotrespectmethodredefinitionof“+”methodssuchasInteger#
考虑这样一个简单的枚举器:natural_numbers=Enumerator.newdo|yielder|number=1loopdoyielder.yieldnumbernumber+=1endend我的问题是:为什么ruby要求我们在yielder对象上调用yield?换句话说:为什么我们不能将yielder.yieldnumber替换为yieldnumber?在这个例子中,如果允许的话,它看起来是一样的。是否有以非平凡的方式使用yielder的示例?有的话可以给一份吗?如果不是,yielder的目的是什么?谢谢。 最佳答案
在Ruby2.4和整数范围中,Range(Enumerable)#sum是optimized直接返回结果,无需遍历所有元素。不明白为什么要在enum.c中定义相应的代码对于Enumerable模块而不是range.c对于Range类。为什么Enumerable应该知道包含它的类(例如Range、Hash...)并检查它们的类型而不是让这些类覆盖Enumerable#sum?见于enum.c:returnint_range_sum(beg,end,excl,memo.v);#orhash_sum(obj,&memo); 最佳答案 因为
Enumerable#lazy依赖于提供#each方法的枚举。如果您的可枚举对象没有#each方法,您就不能使用#lazy。现在Kernel#enum_for和#to_enum提供了指定枚举方法的灵active,而不是#each:Kernel#enum_for(method=:each,*args)但是#enum_for和friend们总是构建普通(非惰性)枚举器,而不是Enumerator::Lazy。我看到Ruby1.9.3中的Enumerator提供了这种类似形式的#new:Enumerator#new(obj,method=:each,*args)不幸的是,构造函数在Ruby2