2012-11-16 31 views
2

我想弄清楚如何將一個語句作爲方法參數傳遞 - 用作塊過濾條件的一部分。例如,我有以下代碼:如何將語句作爲參數傳遞給方法中的塊?

def method 
    other_method.persons.each do |ped| 

    next if ped.first_name.nil? or ped.last_name.nil? 

    puts ped.id 
    puts ped.full_name 
    end 
end 

我想能夠做如下(所以我可以潛在地改變在所述方法中使用的過濾器標準)。是否有可能通過包括從參數塊參考塊的聲明?:

def method(statement) 
    other_method.persons.each do |ped| 

    next if statement 

    puts ped.id 
    puts ped.full_name 
    end 
end 

我很欣賞這方面的一些方向。

回答

0
Ped = Struct.new(:first_name, :last_name, :full_name, :id) 

# generate some test data 
peds = ['Bob', 'Hope', 'Bob Hope', 1, 'Bing', nil, 'Bing Crosby', 2, nil, 'Bacon', 'Kevin Bacon', 3].each_slice(4).map{ |x,y,z,id| Ped.new(x,y,z,id) } 

filter_criteria = lambda { |ped| ped.first_name.nil? or ped.last_name.nil? } 

peds.find_all(&filter_criteria).each { |ped| p ped } 

輸出:

#<struct Ped first_name="Bing", last_name=nil, full_name="Bing Crosby", id=2> 
#<struct Ped first_name=nil, last_name="Bacon", full_name="Kevin Bacon", id=3> 

變化出filter_criteria與另一PROC /λ來改變濾波。另一種方法是包裹find_all的方法中採取濾波塊是這樣的:根據需要

def filter list, &criteria 
    list.find_all(&criteria) 
end 

filter(pedlist) { |ped| some filter criteria }.each { |ped| do something } 

並將所得枚舉然後可以使用。

+0

謝謝。這幫助我理解了我的挑戰。 – 2scottish

6

你不通過你傳遞塊的「語句」。通過的塊通過yield調用或捕獲到proc中並用Proc#call調用。

def method 
    other_method.persons.each do |ped| 
    next if yield(ped) 

    puts ped.id 
    puts ped.full_name 
    end 
end 

method { |ped| ped.first_name.nil? or ped.last_name.nil? } 
+0

這是非常有幫助的。謝謝。 – 2scottish

相關問題