Python's enumerate in Ruby?

27
def enumerate(arr):
    (0..arr.length - 1).to_a.zip(arr)

有没有内置的功能可以做到这一点?它不需要将其成员设置为不可变,只需要在标准库中存在即可。我不想成为为了在项目中添加Python功能而子类化Array类的那个人。

在Ruby中它有不同的名称吗?

%w(a b c).enumerate
=> [[0, "a"], [1, "b"], [2, "c"], [3, "d"]] 
4个回答

37

Python中类似这样的代码:

a = ['do', 're', 'mi', 'fa']
for i, s in enumerate(a):
    print('%s at index %d' % (s, i))

在 Ruby 中,它变成了这样:

a = %w(do re mi fa)
a.each_with_index do |s,i|
    puts "#{s} at index #{i}"
end

1
a = 'do re mi fa'.split() 可能更接近 Ruby 版本。 - Antimony

8
假设这是枚举, 可以使用each_with_index来实现。或者如果您有一个Enumerator, 只需使用with_index即可。

7
也许更快的解决方案是:
%w(a b c).map.with_index {|x, i| [i, x] }

嘿...这看起来更熟悉 ;) - yurisich

2
一个有趣的例子!
a = %w(do re mi fa)
a.length.times.zip a

在Python中,这将是zip(range(len(a)), a),以防万一您和我一样需要运行irb才能理解这个聪明的.times的用法。非常好。 - yurisich

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接