2008-09-19 13 views
12

संभव डुप्लिकेट:
What does map(&:name) mean in Ruby?समझौता [ClassOne, ClassTwo] चाहते प्रत्येक (और: my_method)

मैं एक railscast देख रहे हैं और इस कोड को देखा गया था।

[Category, Product].(&:delete_all) 

डेटाबेस को समाशोधन के संबंध में।

मैं आईआरसी में लाइन के बारे में पूछा और कहा गया था

(&:delete_all) 

मैं निम्नलिखित

class ClassOne 
    def class_method 
    puts 1 
    end 
end 

class ClassTwo 
    def class_method 
    puts 2 
    end 
end 

[ClassOne, ClassTwo].each(&:class_method) 

मैं कह एक त्रुटि प्राप्त के साथ इस परीक्षण किया के लिए

{|model| model.delete_all} 

एक शॉर्टकट था

Wrong Argument type Symbol (expected Proc) 

मैं भी

one = ClassOne.new 
two = ClassTwo.new 

[one, two].each(&:class_method) 

की कोशिश की लेकिन वह अभी भी विफल रहा है।

अगर मैं संशोधित यह

[one, two].each{|model| model.class_method} 

सब कुछ काम किया पढ़ने के लिए अपेक्षा के अनुरूप।

तो, &:delete_all वास्तव में क्या करता है? दस्तावेज़ कहते हैं delete_all एक विधि है, इसलिए मैं यहां पर क्या हो रहा है इस बारे में उलझन में हूं।

उत्तर

20

यह एक रूबी 1.9 एक्सटेंशन है, जो 1.8 में निम्नलिखित को शामिल करके किया जा सकता है पर निर्भर करता है:

class Symbol 
    def to_proc 
     proc { |obj, *args| obj.send(self, *args) } 
    end 
end 

मेरा मानना ​​है कि रेल ActiveSupport में यह परिभाषित करता है।

+0

यह सही है; यदि आपने आईआरबी में अपना परीक्षण चलाया है, तो यह काम नहीं करेगा (मान लें कि आप रूबी 1.8.एक्स चला रहे हैं)। स्क्रिप्ट/कंसोल में इसे फिर से आज़माएं। –

3

यह रूबी, symbol to proc के कुछ रेल विशिष्ट पैचिंग है।

+0

यह उत्तर सच साबित होता था, लेकिन रूबी 1.8.6 और इससे पहले वास्तव में विरासत है। –

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