在ruby中,如何在可枚举的对象上使用\u索引和\u对象进行链接?
我想处理数组在ruby中,如何在可枚举的对象上使用\u索引和\u对象进行链接?,ruby,enumerable,ruby-block,Ruby,Enumerable,Ruby Block,我想处理数组['a','b','c']以返回字符串'0a1b2c'(即,通过将每个索引与其值串联而形成的字符串) 我可以这样做: result = '' ['a', 'b', 'c'].each.with_index do |char, i| result += "#{i}#{char}" end result 我想通过使用with_对象消除块外的结果变量 大概是这样的: ['a', 'b', 'c'].each.with_index.with_object('') do |char,
['a','b','c']
以返回字符串'0a1b2c'
(即,通过将每个索引与其值串联而形成的字符串)
我可以这样做:
result = ''
['a', 'b', 'c'].each.with_index do |char, i|
result += "#{i}#{char}"
end
result
我想通过使用with_对象消除块外的结果变量
大概是这样的:
['a', 'b', 'c'].each.with_index.with_object('') do |char, i, result|
result += "#{i}#{char}"
end
但是这会为nil:NilClass引发一个错误未定义的方法“+”
arr.each.with_index.with_object('') { |(each, n), obj| ... }
这是怎么回事
- 将
与\u索引
和与\u对象
一起应用将创建嵌套元组
(每个,n),obj
解包两个元组
有趣的事实,或者更令人伤心的事实,嵌套的元组实际上是作为一个短期数组具体化的,因此这将创建O(n)
数组。如果这是一个关键的生产代码路径,我会将这两个枚举函数嵌套起来。由于您很可能要将obj
赋值给外部作用域中的变量,因此将其重写为
obj = ''
arr.each_with_index { |each, n| ... }
这两个操作都应在不滥用每个迭代器的情况下进行:
%w|a b c|.map.with_index do |char, i|
"#{i}#{char}"
end.join
%w|a b c|.each_with_object('').with_index do |(char, result), i|
result << "#{i}#{char}"
end
%w | a b c | map.with | u index do | char,i|
“{i}{char}”
结束,加入
%w | a b c |。每个_带有_对象(“”)。带有_索引do |(字符,结果),i|
结果它不使用您要求的方法,但它可以完成任务,并且相对紧凑:
array = ['a', 'b', 'c']
(0...array.size).zip(array).join
#=> "0a1b2c"
此解决方案有一些重要的优点:
%w | a b c |。每个_带有_对象(“”)。带有_索引do |(字符,结果),i|
结果实际上,它们不应该嵌套。更新了性能讨论。Benchmark
说了什么?有时候Ruby中的东西会有反直觉的速度。短寿命对象是Ruby应用程序中常见的主要性能问题,很难用基准测试来衡量这一点,但因为对象创建的成本发生在垃圾收集中。不难衡量,您只需要运行它超过一个微不足道的周期数。一般的经验法则是,如果您的每个迭代都没有得到10s-60s的运行,那么您就没有完成足够的周期来收集有意义的数据。你是对的,垃圾收集器可能是要付出的最大代价,这就是你在测试时必须投入的原因。试试这个:enum=['a'、'b'、'c'].each.with_index.with_object('')#=>#
。此枚举器生成并传递给块的元素将是enum.to#a#=>[[“a”,0],“”],[[“b”,1],“”],[[“c”,2],“”],“”]
这告诉您需要如何写入块变量:(char,i),result=enum.next#=>[[a],0],“”]
,所以char;i#=>0;结果#=>“”
。注意,结果
将在计算过程中发生变化。map.with_index
非常好!大家好,欢迎来到SO!请看一看(特别是在代码格式方面),以提高未来文章的可读性。完成了&非常抱歉!
array = ['a', 'b', 'c']
(0...array.size).zip(array).join
#=> "0a1b2c"