2012-05-21 11 views
7

मैं रूबी के लिए नया हूं। मैं कई अन्य भाषाओं से परिचित हूं। मेरा सवाल ऑर्डर के बाहर तरीकों को कॉल करने के बारे में है। उदाहरण के लिए:रूबी में विधि आदेश कैसे संभालें?

def myfunction 
    myfunction2 
end 

def myfunction2 
    puts "in 2" 
end 

मैं घोषित होने से पहले myfunction2 को कैसे कॉल कर सकता हूं? कई भाषाओं में आप इसे शीर्ष पर या एक .h फ़ाइल में घोषित करने देते हैं। रूबी इसे कैसे संभालता है? जब मैं एक वर्ग के लिए def initialize के अंदर एक और तरीका कॉल करने की आवश्यकता

def myfunction2 
    puts "in 2" 
end 

def myfunction 
    myfunction2 
end 

मुख्य रूप से इस कीड़े मुझे:

मैं हमेशा इस का पालन करने की आवश्यकता है।

उत्तर

18

आप इसे परिभाषित करने से पहले एक विधि को कॉल नहीं कर सकते हैं। हालांकि, इसका मतलब यह नहीं है कि आप myfunction2 से पहले myfunction को परिभाषित नहीं कर सकते!रूबी देर से बाध्यकारी है, इसलिए myfunction में myfunction2 पर कॉल myfunction पर कॉल करने से पहले वास्तविक myfunction2 से संबद्ध नहीं होगा। इसका मतलब यह है कि जब तक myfunction पर पहली बार myfunction2 घोषित किया गया है, तो आपको ठीक होना चाहिए।

तो, यह ठीक है:

def myfunction 
    myfunction2 
end 

def myfunction2 
    puts "in 2" 
end 

myfunction 

और यह नहीं है:

def myfunction 
    myfunction2 
end 

myfunction 

def myfunction2 
    puts "in 2" 
end 
+2

नोट गैर काम उदाहरण एक 'BEGIN' बयान जोड़कर कोड काम में ठोक जा सकता है: 'BEGIN {def myfunction2; "2 में" रखता है; अंत} '। – steenslag

+2

@steenslag एक 'बेहतर' कथन जोड़ने का एक बेहतर तरीका होगा: 'END {myfunction}'। –

-1

आप किसी भी क्रम में विधि को परिभाषित कर सकते हैं, ऑर्डर कुछ भी मायने रखता नहीं है।

1

रूबी भाषा व्याख्या की है, तो यह उदाहरण के कार्यों के आदेश पर निर्भर नहीं है,:

[1] pry(main)> def myfunction 
[1] pry(main)* myfunction2  
[1] pry(main)* end 
=> nil 
[2] pry(main)> 
[3] pry(main)> def myfunction2 
[3] pry(main)* puts "in 2"  
[3] pry(main)* end 
=> nil 
[4] pry(main)> myfunction 
in 2 
=> nil 
इसके अलावा, अगर, उदाहरण के लिए, समारोह गैर मौजूदा समारोह तो क्रम अपवाद बुलाया जाएगा कॉल

केवल अगर वह कार्य नहीं करेंगी बुलाया, मैं। ई .:

[5] pry(main)> def foo 
[5] pry(main)* blubry_starego_marycha 
[5] pry(main)* end 
=> nil 
[6] pry(main)> def boo 
[6] pry(main)* "bom bom bom" 
[6] pry(main)* end 
=> nil 
[7] pry(main)> boo 
=> "bom bom bom" 
[8] pry(main)> foo 
NameError: undefined local variable or method `blubry_starego_marycha' for main:Object 
from (pry):9:in `foo' 

जैसा कि आप देख मैं समारोह foo nonexisting समारोह blubry_starego_marycha कॉल और रूबी इसके साथ ठीक है कि घोषित कर दिया है, यह अपवाद बढ़ा केवल अगर मैं foo कहते हैं।

7

केवल समय विधि क्रम मामलों विशुद्ध रूप से प्रक्रियात्मक कोड में है, और है कि आमतौर पर अदूरदर्शी है, दो तरीकों दिया:

def greet 
    puts "%s, Dave" % random_greeting 
end 
# If I try to use `greet` here, it'll raise a NoMethodError 
def random_greeting 
    ["Hello", "Bonjour", "Hallo"].sample 
end 
# I can use `greet` here, because `random_greeting` is now defiend 

यह ठीक काम करेगा, जब तक आप का उपयोग करने के greetrandom_greeting से पहले परिभाषित किया गया है चाहता था,

class Doorman 
    def greet 
    puts "%s, Dave" % random_greeting 
    end 
    def random_greeting 
    ["Hello", "Bonjour", "Hallo"].sample 
    end 
end 
Doorman.new.greet 

एक तो, Doorman.new.greet साथ किसी के मेहमानों का स्वागत कर सकते हैं एक कक्षा में व्यवहार लपेटकर द्वारा एक आवेदन bett मॉडल कर सकते हैं: जिस तरह से है कि सभी गैर तुच्छ कोड इस को हल करती है एक कक्षा में व्यवहार रैप करने के लिए है er (शायद आपके होटल कोड में विभिन्न ऑब्जेक्ट्स अलग-अलग बधाई देते हैं, उदाहरण के लिए) और यह main नेमस्पेस को भी साफ रखता है।

main रूबी में ऑब्जेक्ट में पहले से ही 114 विधियों को परिभाषित किया गया है, इसलिए अपने स्वयं के तरीकों को कक्षाओं में रखना बेहतर है जो आपके प्रोजेक्ट के मॉडल में अभिनेताओं या वस्तुओं का प्रतिनिधित्व करते हैं।

क्या आप प्रश्न में कहा करने के लिए इसके अलावा के बारे में एक वर्ग की इनिशियलाइज़ में, यह पूरी तरह संभव है:

class Doorman 
    def initialize 
    puts "%s, I'm a new Doorman instance" & random_greeting 
    end 
    def greet 
    "%s, Dave" % random_greeting 
    end 
    def random_greeting 
    ["Hello", "Bonjour", "Hallo"].sample 
    end 
end 

हालांकि विधि random_greeting परिभाषित नहीं है जब हम initailize लिखते हैं, पूरी कक्षा initialize से पहले परिभाषित किया गया है कभी भी कहा जाता है। फिर, कक्षाओं को लपेटकर, यह जीवन को आसान बनाता है, क्लीनर और इसका मतलब है कि चीजें encapsulated रहती हैं।

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