2017-04-13 7 views
5

मैं समझता हूँ किपैरामीटर 'और ब्लॉक' के साथ विधि में 'उपज स्वयं' का उपयोग करने में कोई अंतर है और पैरामीटर 'और ब्लॉक` के बिना किसी विधि में' उपज स्वयं '?

def a(&block) 
    block.call(self) 
end 

और

def a() 
    yield self 
end 

समान परिणाम प्राप्त है, अगर मुझे लगता है इस तरह के एक ब्लॉक a {} नहीं है।

def a(&block) 
    yield self 
end 

यह एक है: है, क्योंकि मुझे लगता है कि जैसे कुछ कोड पर ठोकर खाई है कि क्या यह किसी भी फर्क नहीं पड़ता या वहाँ होने (अगर मैं चर/संदर्भ ब्लॉक अन्यथा उपयोग नहीं करते हैं) के किसी भी लाभ है - मेरा प्रश्न है ठोस मामले में जहां मैं &block के उपयोग समझ में नहीं आता:

def foo;  end 
def bar(&blk); end 

method(:foo).parameters #=> [] 
method(:bar).parameters #=> [[:block, :blk]] 

IDEs और प्रलेखन:

def rule(code, name, &block) 
    @rules = [] if @rules.nil? 
    @rules << Rule.new(code, name) 
    yield self 
end 
+0

[ब्लॉक तर्क] (http://ruby-doc.org/core-2.4.1/doc/syntax/methods_rdoc.html#label-Block+Argument) के लिए दस्तावेज़ विभिन्न उपयोग मामलों को दर्शाता है। – Stefan

+0

@Stefan मैंने एक विशिष्ट मामला जोड़ा जहां मुझे उपयोग और ब्लॉक के उपयोग को समझ में नहीं आया, शायद मुझे कुछ याद आती है, तो आप एक नज़र देख सकते हैं? इसके अलावा मैं प्रलेखन पढ़ता हूं और यह मेरी समझ से मेल खाता है। –

+0

यदि आप स्पष्ट रूप से इसका उपयोग नहीं करेंगे, तो इसे सूची में शामिल न करें। यह invocations धीमा बनाता है और यह भ्रमित है। – ndn

उत्तर

8

केवल लाभ मैं के बारे में सोच सकते हैं आत्मनिरीक्षण के लिए है जनरेटर इसका लाभ उठा सकते हैं। हालांकि, यह रुबी के तर्क को पारित नहीं करता है। किसी विधि को कॉल करते समय, आप ब्लॉक को पास या छोड़ सकते हैं, भले ही इसे घोषित किया गया हो या न किया जाए।

+1

कम से कम मेरे लिए, यह केवल आत्मनिरीक्षण के बारे में नहीं है। मुझे विधि हस्ताक्षर को देखने में बहुत आसान लगता है और देखें कि आखिरी तर्क में पूरी विधि को देखने और कहीं 'उपज' खोजने की कोशिश करने की तुलना में अग्रणी '& 'है। –

1

def pass_block 
    yield 
end 
pass_block { 'hi' } #=> 'hi' 

और

def pass_proc(&blk) 
    blk.call 
end 
pass_proc { 'hi' } #=> 'hi' 

के बीच मुख्य अंतर यह है कि, blk, Proc का एक उदाहरण, एक वस्तु है और इसलिए अन्य तरीकों के लिए पारित किया जा सकता है। इसके विपरीत, ब्लॉक वस्तुओं नहीं हैं और इसलिए चारों ओर पारित नहीं किया जा सकता है।

def pass_proc(&blk) 
    puts "blk.is_a?(Proc)=#{blk.is_a?(Proc)}" 
    receive_proc(blk) 
end 

def receive_proc(proc) 
    proc.call 
end 

pass_proc { 'ho' } 
blk.is_a?(Proc)=true 
    #=> "ho" 
संबंधित मुद्दे