2011-06-03 19 views
29

मैं ने पाया है कि सभी उदाहरणों में है कि मैं के लिए देखा है (रेल दस्तावेज शामिल): यदि सत्यापन तरीकों का विकल्प लैम्ब्डा के बजाय Proc.new का उपयोग करता है, उदाहरण के लिएरेल सत्यापन: if => Proc.new या lambda?

class Foo < ActiveRecord::Base 
    validates_presence_of :name, :if => Proc.new{|f| .... } # why not lambda here? 
end 

इसके लिए किसी भी कारण है? जहाँ तक मुझे पता है, लैम्ब्डा

  1. तर्कों के साथ अधिक सख्त है।
  2. कॉलिंग समारोह से नहीं, ब्लॉक से लैम्ब्डा ब्लॉक रिटर्न में भी बयान वापस करें।

दोनों के लिए वांछनीय व्यवहार प्रतीत होता है: यदि ऊपर उल्लिखित विकल्प है, तो क्या मुझे कुछ याद आ रही है?

उत्तर

36

दोनों के लिए वांछनीय व्यवहार प्रतीत होता है: यदि ऊपर उल्लिखित विकल्प है, तो क्या मुझे कुछ याद आ रही है?

मेरा अनुमान है कि यह है कि:

यह रूप में वे तर्क की संख्या के बारे में परवाह नहीं है Procs अनुमति देने के लिए अधिक वांछनीय है। तो मैं आसानी से नीचे के किसी भी लिख सकते हैं:

validates_presence_of :name, :if => Proc.new{|f| f.display_name.blank? } # I care about 'f' here as I need it to check something. 

... और:

validates_presence_of :secret_sauce, :if => Proc.new{ MyApp::REQUIRE_SECRET_SAUCE } # I don't care about any arguments being passed in. 

यह एक छोटी सी बात की तरह लग सकता है, लेकिन मैं यह लचीलापन करने के लिए कहते हैं लगता है।

+0

धन्यवाद जिट्स, मुझे लगता है कि यह बहुत दुर्लभ है कि मैं इसका उपयोग करता हूं: यदि मॉडल उदाहरण के बिना विकल्प, तो उस मामले में मैं अभी भी डाल सकता हूं | डमी | क्या आप वहां मौजूद हैं। तो मैं लैम्ब्डा के साथ जाऊंगा, लेकिन आप स्पष्टीकरण समझ में आता है। –

+0

लेकिन क्या हमें वास्तव में एक तर्क के रूप में उदाहरण को पारित करने की आवश्यकता है? अगर मैं सही ढंग से समझता हूं, ब्लॉक में कोड (या तो Proc.new या lambda में) केवल तभी तैयार किया जाएगा जब आवश्यक हो और कुछ ऐसा लिखना संभव हो: है_मनी: related_objects पहले_सेव: do_something, if: -> { associated_objects.empty? } ध्यान दें कि मैंने तर्क छोड़ दिया {| instance | example.associated _...} – januszm

संबंधित मुद्दे