2013-08-15 87 views
0

我正試圖想辦法做到這一點,作爲一個proc。本質上,唯一不同的部分是在子字符串上匹配它們是.include?而不是檢查等於。包含紅寶石的塊/程序

def check_exact_match(lead_attribute, tracker_attribute) 
    return true if tracker_attribute.nil? 
    return true if lead_attribute.downcase == tracker_attribute.downcase 
    false 
end 


def check_substring_match(lead_attribute, tracker_attribute) 
    return true if tracker_attribute.nil? 
    return true if lead_attribute.downcase.include? tracker_attribute.downcase 
    return false 
end 
+1

請注意'如果cond1返回true;如果cond2返回true;假'也可以寫成'cond1 ||' cond2'。 – sepp2k

回答

1

我不確定我是否記得如何在Ruby中優雅地編寫代碼,但是這樣的事情呢?

def check­_match(lea­d_attribut­e, track­er_attribu­te)­ 
    track­er_attribu­te.nil? or yield lead_­attribute,­ track­er_attribu­te 
end 

該函數然後可以調用這樣的:從@busy_wait

check_match("abcd", "bd") { |l, t| l.downcase == t.downcase } 
check_match(la, ta) { |l, t| l.downcase.include? t.downcase } 
+0

我知道OP說他想要一個proc,但是如果它使用了一個塊,這會更加地道。 – sepp2k

+0

@ sepp2k:我不知道,在我腦海裏,一個街區並不真正代表一個謂詞。 – idoby

+1

許多方法都將塊作爲謂詞('select','find','all?','any?')。我想不出一個以lambda/proc作爲謂詞的單一標準庫方法(實際上,我認爲只需要一個lambda的唯一標準庫方法是'Hash#default_proc =',這只是因爲它在語法上不可能取得塊)。 – sepp2k

0

改性。

def check­_match(lea­d_attribur­e, track­er_attribu­te, &condition)­ 
    track­er_attribu­te.nil? or condition.­call(lead_­attribute,­ track­er_attribu­te) 
end 

def check_exact_match(lead_attribute, tracker_attribute) 
    check_match(lea­d_attribur­e, track­er_attribu­te) { |l, t| l.downcase == t.downcase } 
end 

def check_substring_match(lead_attribute, tracker_attribute) 
    check_match(lea­d_attribur­e, track­er_attribu­te) { |l, t| l.downcase.include? t.downcase } 
end