Ruby 学习编程-每个方法示例-需要了解迭代的帮助
在ChrisPine的《学习编程》一书(第10章)中,他使用以下示例解释ruby如何将一个bloc更改为proc。所以我理解这一部分,尽管不理解迭代。。 下面是示例/代码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
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