Ruby塊(Block)和迭代器(Iterator)是Ruby編程語言中兩個非常有用的特性,它們可以幫助我們以更簡潔、優雅的方式處理數據集合。下面分別介紹它們的實現功能。
Ruby塊是一個匿名函數,它可以接受參數并返回值。塊在Ruby中以一對大括號{}
表示,可以放在方法調用時,或者使用do...end
語法。塊可以捕獲其外部作用域中的變量,這使得我們可以在塊內部訪問和操作這些變量。
例如,我們可以定義一個簡單的sum
方法,該方法接受一個數組作為參數,并使用塊計算數組中所有元素的和:
def sum(array)
array.inject(0) { |sum, num| sum + num }
end
numbers = [1, 2, 3, 4, 5]
puts sum(numbers) # 輸出 15
在這個例子中,inject
方法接受一個初始值(這里是0)和一個塊。塊中的sum
變量會累積數組中的每個元素。inject
方法會遍歷數組中的每個元素,并將當前累積值與元素相加,然后將結果作為下一次迭代的新累積值。
迭代器是一個對象,它允許你遍歷一個數據集合(如數組、集合或其他可迭代對象)。迭代器通過定義each
方法來實現這個功能,該方法接受一個塊作為參數,并在每次迭代時將當前元素傳遞給塊。
例如,我們可以定義一個簡單的even_numbers
迭代器,用于生成一個包含所有偶數的無限序列:
class EvenNumbers
def initialize(start = 0)
@current = start
end
def each
while @current < Float::INFINITY
yield @current if @current.even?
@current += 2
end
end
end
even_numbers = EvenNumbers.new
even_numbers.each { |num| puts num } # 輸出 0, 2, 4, 6, ...
在這個例子中,EvenNumbers
類包含一個initialize
方法,用于設置迭代器的起始值。each
方法使用一個無限循環來生成偶數序列。在每次迭代中,我們使用yield
關鍵字將當前元素傳遞給塊,并將當前值加2以生成下一個偶數。
總之,Ruby塊和迭代器都是非常有用的特性,它們可以幫助我們以更簡潔、優雅的方式處理數據集合。塊可以作為參數傳遞給方法,而迭代器則允許我們遍歷數據集合。