Ruby 从块内访问我正在调用的“select”对象

Ruby 从块内访问我正在调用的“select”对象,ruby,Ruby,这将是一个有助于说明这一点的结构示例。尽管请注意,我的目标不是完成本例的特定逻辑,而是了解如何在此上下文中访问该对象 “0234”。拆分。每个索引都要| 放置“self”[i]完全不需要使用索引: 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 我感到一定程度的沮丧,因为你觉得自己缺少一些

这将是一个有助于说明这一点的结构示例。尽管请注意,我的目标不是完成本例的特定逻辑,而是了解如何在此上下文中访问该对象

“0234”。拆分。每个索引都要|
放置“self”[i]完全不需要使用索引:

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

我感到一定程度的沮丧,因为你觉得自己缺少一些基本的东西。让我们从返回原始代码开始,看看发生了什么。你有:

  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"]
与此进行比较:

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"]
看看发生了什么?在这两种情况下,枚举数都是将a和b元素的索引传递给块,而不是将元素传递给块

现在考虑以下内容:

a.each_index.select { |i| i > 1 } #=> [2,3]
b.each_index.select { |i| i > 1 } #=> [2,3]
这两个选项都选择块i>1中表达式计算为true的索引i

最后,将其与:

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

我希望这有帮助。不要犹豫问问题。

好吧,我真的不想提chr,我简化了问题以便集中精力。我实际上会想要索引。更新的答案,如果你想访问st,你不需要使用self,st在每个区块的范围内。请从下次开始在问题中提出你的要求。问题的标题没有改变,这正是我想知道的!这就是否决票的意义吗?使用select的目的是什么?你的代码示例,与方法selects usecase不符..vint-i-vuit,我同情你要求解释否决票的原因,但是当有否决票时,当然当有不止一个否决票时,你通常可以从评论中找出问题所在。在这里,您不应该通过引用代码来解释您想要做什么。用文字表达,准确、简洁、完整,并在有帮助时添加样本输入和输出。这里的示例输入是st=0234。您希望该方法打印和/或返回什么?不要说这是显而易见的。事实并非如此。我建议你编辑你的问题帖子投票!为了避免额外的下行投票。@vint-i-vuit,您的目标是在块内提供一个引用接收器的变量吗?如果是这样,请详细说明您试图解决的具体问题。包含随机码不可能得到令人满意的答案。使用v1.9+是否符合您的要求?”0234'.split.tap{| a | a.每个|索引{| i |放置一个[i]}打印0,2,3和4,并返回[0,2,3,4]。感谢您的详细评论!我想做的是访问a或bi.e。在块内引用方法接收器的变量,但不使用变量a或b。也就是说,`%w{I love chocolate cake}。每个_都有_索引。选择{e,I{124;访问%w{I love…}这里}`。我相信扎克坎普在评论中解释得很清楚。
a.each_index.select { |i| i > 1 } #=> [2,3]
b.each_index.select { |i| i > 1 } #=> [2,3]
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]]