这将是一个希望有助于说明这一点的结构的一个例子。虽然请注意我的目标是不来完成此示例的具体逻辑,而是要了解如何在此处访问该对象上下文。
'0234'.split('').each_index do |i|
puts 'self'[i] # <- Here
end
在“此处”级别,我想将'self'
替换为操作'0234'.split('')
的结果,我认为self
会这样做,但通过调试我发现{{1} }。
答案 0 :(得分:1)
根本不需要使用索引:
st='0234'
st.each_char do |chr|
puts chr
end
关于评论:
st='0234'
st.each_char.with_index do |chr, idx|
puts idx
puts chr
end
答案 1 :(得分:1)
我觉得有一种令人沮丧的程度,即你觉得自己缺少一些相当基本的东西。让我们回到原始代码,看看发生了什么。你有:
st = '0234'
a = st.split('') # ["0", "2", "3", "4"]
a.each_index.select do |i|
puts a[i]
end
试试这个:
a.each_index #=> <Enumerator:["0","2","3","4"]:each_index>
a.each_index.to_a #=> [0, 1, 2, 3]
a.each_index { |i| puts i } #=> ["0","2","3","4"]
其中=>
表示返回值。最后一个语句打印以下四行:
0
1
2
3
与此相比:
b = %w{I love chocolate cake} #=> ["I","love","chocolate","cake"]
b.each_index #=> <Enumerator:["I","love","chocolate","cake"]:each_index>
b.each_index.to_a #=> [0, 1, 2, 3]
b.each_index { |i| puts i } #=> ["I","love","chocolate","cake"]
最后一句话印有相同的四行:
0
1
2
3
看看发生了什么?在这两种情况下,枚举器都将a
和b
元素的索引(不是元素)传递给块。
现在考虑以下事项:
a.each_index.select { |i| i > 1 } #=> [2,3]
b.each_index.select { |i| i > 1 } #=> [2,3]
这两个select
索引i
,其中块(i > 1
)中的表达式的计算结果为true
。
最后,将其与以下内容进行比较:
a.each_with_index #=> <Enumerator:["0","2","3","4"]:each_with_index>
a.each_with_index.to_a #=> [["0",0], ["2",1], ["3",2], ["4",3]]
b.each_with_index
#=> <Enumerator:["I","love","chocolate","cake"]:each_with_index>
b.each_with_index.to_a #=> [["I",0],["love",1],["chocolate",2],["cake",3]]
a.each_with_index.select { |e,i| i > 1 } #=> [[3,2],[4,3]]
b.each_with_index.select { |e,i| i > 1 } #=> [["chocolate",2],["cake",3]]
我希望这会有所帮助。不要犹豫提问。