访问对象我正在呼叫"选择"在街区内

时间:2014-03-09 21:20:55

标签: ruby

这将是一个希望有助于说明这一点的结构的一个例子。虽然请注意我的目标是来完成示例的具体逻辑,而是要了解如何在此处访问该对象上下文。

'0234'.split('').each_index do |i|
  puts 'self'[i] # <- Here
end

在“此处”级别,我想将'self'替换为操作'0234'.split('')的结果,我认为self会这样做,但通过调试我发现{{1} }。

2 个答案:

答案 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

看看发生了什么?在这两种情况下,枚举器都将ab元素的索引(不是元素)传递给块。

现在考虑以下事项:

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]]

我希望这会有所帮助。不要犹豫提问。