Ruby 学习编程-每个方法示例-需要了解迭代的帮助

Ruby 学习编程-每个方法示例-需要了解迭代的帮助,ruby,proc,Ruby,Proc,在ChrisPine的《学习编程》一书(第10章)中,他使用以下示例解释ruby如何将一个bloc更改为proc。所以我理解这一部分,尽管不理解迭代。。 下面是示例/代码 class Array def eachEven(&wasABlock_nowAProc) # We start with "true" because arrays start with 0, which is even. isEven = true self.each do |objec

在ChrisPine的《学习编程》一书(第10章)中,他使用以下示例解释ruby如何将一个bloc更改为proc。所以我理解这一部分,尽管不理解迭代。。 下面是示例/代码

class Array
  def eachEven(&wasABlock_nowAProc)

 # We start with "true" because arrays start with 0, which is even.

    isEven = true

    self.each do |object|
      if isEven
        wasABlock_nowAProc.call object
      end

      isEven = (not isEven)  # Toggle from even to odd, or odd to even.
    end
  end
end

['apple', 'bad apple', 'cherry', 'durian'].eachEven do |fruit|
  puts 'Yum!  I just love '+fruit+' pies, don\'t you?'
end

# Remember, we are getting the even-numbered elements
# of the array, all of which happen to be odd numbers,
# just because I like to cause problems like that.

[1, 2, 3, 4, 5].eachEven do |oddBall|
  puts oddBall.to_s+' is NOT an even number!'
end
这就产生了

Yum!  I just love apple pies, don't you?
Yum!  I just love cherry pies, don't you?
1 is NOT an even number!
3 is NOT an even number!
5 is NOT an even number!
在我看来,eachEven方法似乎只调用
。传入的块上的每个
方法,然后将
isEven
设置为
而不是isEven
。有人能解释一下流程和代码的切换部分吗。。 谢谢你们,我真的很感谢你们给我的帮助。

self。每一个都是。它正在调用数组上的
每个

换句话说,该代码块(在第一个示例中)将循环4次。在第一个循环中,
object=='apple'
;然后在第二个循环中,
object==“bad apple”


isEven
被用作标志。您提到的方法是切换它:

isEven = true         # isEven == true
isEven = (not isEven) # isEven == false
isEven = (not isEven) # isEven == true
isEven = (not isEven) # isEven == false
isEven = (not isEven) # isEven == true

最终的结果是代码块在数组中的任何其他元素上执行。(“跳过奇数”元素,其中
isEven==false

以下是我将如何编写该方法(也符合以下要求):


啊哈,现在我看到了我推理中的错误。谢谢你给我看流程。我现在了解了方法中迭代的“not isEven”切换部分的情况。我了解您的代码,感觉它更容易阅读。谢谢你添加它。我只有一个问题。我看到您将.each方法与.with_索引方法相结合。我看到你用一个不死分数把他们连在一起。那赛尔夫呢。这部分代码是否与self.each.with_indexah相同。谷歌搜索了一下。看起来每个带有索引的\u都是一个独立的方法,不同于。带有索引的\u不接受任何偏移参数。太棒了@是的,没错
每个带索引的方法与带索引的方法是完全独立的(尽管密切相关)。您只能将ruby方法与
链接在一起,不能使用下划线!我删除了
self
,只是因为它不需要:在ruby中,当您进行这样的方法调用时,有一个隐式的
self
。(请参阅:“避免
self
(仅在调用自写访问器、以保留字命名的方法或可重载运算符时才需要)。)Thx。现在我更明白了。
class Array
  def each_even(&block)
    each_with_index do |object, index|
      block.call(object) if index.even?
    end
  end
end

['apple', 'bad apple', 'cherry', 'durian'].each_even do |fruit|
  puts "Yum!  I just love #{fruit} pies, don't you?"
end