1、yield關鍵字
yield語句就像乙個方法呼叫,它的後面可以接零個或多個表示式,而這些表示式的值將被賦給對應的**塊形參。
[ruby]view plain
copy
def sequence(n,m,c)
i = 0
while iyield m*i + c
i += 1
endend
sequence(3,5,1)
輸出 1 6 11
block_given?是kenel的乙個方法,可用於是否呼叫乙個**塊。
[ruby]view plain
copy
def sequence(n,m,c)
i,s = 0,
while iy = m*i + c
yield y if block_given?
s << y
i += 1
ends
enda =sequence(3,5,1) #yield
puts a
上面例子中如果**塊存在則呼叫yield語句,否則不呼叫。
2、數值迭代器
integer類包含三個常用的迭代器:
upto 把每乙個整數都傳遞給其相關聯的**塊,而且包含該區間的起始和結束端點。
[ruby]view plain
copy
4.upto(6) do |x|
puts x
end downto 類似與upto。
[ruby]view plain
copy
4.downto(1) do |x|
puts x
end
times 當在整數上呼叫integer.times時,方法將呼叫相關聯**n次,並把0---n-1的值一次傳遞給**塊
[ruby]view plain
copy
3.times # 0 1 2
step 相當於步長
[ruby]view plain
copy
0.step(math::pi,0.1)
3、可列舉物件
array hash range
下面例子可輸出指定檔案的內容:
[ruby]view plain
copy
filename = argv[0]
file.open(filename) do |f|
f.each
end 進一步給每行加入乙個行號,可用each_with_index
[ruby]view plain
copy
filename = argv[0]
file.open(filename) do |f|
f.each_with_index do |line,number|
puts "#: #"
endend
常見的迭代器:
collect 將返回值放到陣列中
[ruby]view plain
copy
squares = [1,2,3].collect
print squares #print [1,4,9]
select 如果**塊返回的值不為false或nil,則選中並組合成乙個陣列返回
[ruby]view plain
copy
evens = (1..10).select
print evens #print [2, 4, 6, 8, 10]
reject 與select相反,它返回那些使**塊返回nil或false的元素。
[ruby]view plain
copy
data = [1,2,3,4,5]
result = data.inject
puts result 4、
外部迭代器:可反覆呼叫乙個列舉器的next方法來遍歷乙個集合的元素,當所有的元素被遍歷之後,next方法丟擲乙個stopiteration異常。
[ruby]view plain
copy
iterator = 1.upto(9)
begin
print iterator.next
while
true
rescue stopiteration
puts "...end"
end
迭代器和可迭代物件
本篇文章簡單談談可迭代物件,迭代器和生成器之間的關係。三者簡要關係圖 可迭代物件與迭代器 剛開始我認為這兩者是等同的,但後來發現並不是這樣 下面直接丟擲結論 1 可迭代物件包含迭代器。2 如果乙個物件擁有 iter 方法,其是可迭代物件 如果乙個物件擁有next方法,其是迭代器。3 定義可迭代物件,...
可迭代物件和迭代器
建立這個物件的類中是否定義了 iter 方法,如果定義了,那麼這個物件就是可迭代物件。isinstance obj,iterable 判斷 判斷乙個物件是不是迭代器的時候,需要判斷建立這個例項物件的類中是否定義了 iter 方法和 next 方法,如果都定義了,那麼這個物件就是可迭代物件。所以如果乙...
可迭代物件和迭代器
實現了 iter 方法的物件稱為可迭代物件,在python中,可迭代物件有字串 列表 元組 字典 集合等 class mynumbers def init self self.a 1 def iter self return self my numbers mynumbers 判斷物件是否是可迭代物...