Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby/20.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中,如何在可枚举的对象上使用\u索引和\u对象进行链接?_Ruby_Enumerable_Ruby Block - Fatal编程技术网

在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"