2012-09-26 18 views
5

यह रूबी कोड:अपरिभाषित विधि `- '" 100 "के लिए: स्ट्रिंग

./to_f.rb:6: undefined method `-' for "100":String (NoMethodError) 

करता रूबी नहीं तार नंबरों के लिए स्वत: परिवर्तित जब पर गणित ऑपरेशनों को:

income = "100" 
bills = "52" 

puts income - bills 

एक त्रुटि फेंक दिया उन्हें?

उत्तर

13

रूबी एक dynamically-typed, strictly-typed (या "दृढ़ता से टाइप" है) भाषा। लुआ एक और ऐसी भाषा है। पूर्व का मतलब है कि चर मूल्य के किसी वर्ग को पकड़ सकते हैं। उत्तरार्द्ध - जो आप चल रहे हैं-इसका मतलब है कि प्रकार का दबाव स्वचालित रूप से नहीं होता है।

इन्हें जावास्क्रिप्ट के साथ तुलना करें, जो गतिशील रूप से टाइप किया गया है और ढीला टाइप किया गया। जावास्क्रिप्ट में आप var x = [] + false; लिख सकते हैं और यह कुछ उपयोगी काम करने के लिए का प्रयास करेगा। एक और उदाहरण के लिए, जावास्क्रिप्ट "1" + 1 == "11" लेकिन "1" - 1 == 0 में। रूबी ऐसी कोई काम नहीं करेगा।

अपने मामले में आप की जरूरत है:

puts income.to_i - bills.to_i 

ध्यान दें कि-क्योंकि रूबी प्रत्येक वर्ग में सबसे operators are implemented as methods चुन सकते हैं कि ऑपरेटर विभिन्न प्रकार के ऑपरेंड संभालती है। उदाहरण के लिए:

class Person 
    def +(something) 
    if something.is_a?(Numeric) 
     self.weight += something 
    elsif something.is_a?(Time) 
     self.age += something 
    else 
     raise "I don't know how to add a #{something.class} to a Person." 
    end 
    end 
end 

अधिकांश समय कोर पुस्तकालय इतने चतुर होने का प्रयास नहीं करते हैं, हालांकि।

+0

मेरे उत्तर से काफी बेहतर! धन्यवाद, Phrogz। –

6

क्योंकि स्ट्रिंग को + ऑपरेटर का उपयोग करके संयोजित किया जा सकता है, यह हमेशा स्पष्ट नहीं होगा कि आप संख्या तारों को दो तारों को जोड़ना या जोड़ना चाहते हैं या नहीं।

आप संख्या पकड़े दो स्ट्रिंग है, तो उन पर किसी भी गणित करने से पहले उचित मान (पूर्णांक या नाव) के लिए उन्हें बदलने:

income = "100" 
bills = "52" 

puts income.to_f - bills.to_f 
संबंधित मुद्दे