2009-07-09 15 views
6

मैं रूबी के लिए नया हूं और हाल ही में रेल अनुप्रयोग पर रुबी बनाते समय मूल्यों की तुलना में एक समस्या में भाग गया।सिंटैक्स चेकिंग पर रेल रूबी की जांच या "संकलन"

if (user.id != params[:id]) 

समस्या user.id था (जो किसी सक्रिय रिकॉर्ड है) एक पूर्णांक और पैरामीटर है [: id] एक स्ट्रिंग है एक नियंत्रक में मैं निम्नलिखित बयान कि हमेशा गलत लौटे था। मुझे यह पता लगाने में थोड़ी देर लग गई और मैंने अंततः इसे बदल दिया:

if (user.id != params[:id].to_i) 

अब कथन अपेक्षित कार्य करता है।

भविष्य में इस त्रुटि से बचने के लिए यदि आप दो अलग-अलग प्रकारों की तुलना करने की कोशिश करते हैं तो आपको "संकलित" करने के लिए एक तरीका है या रूबी प्राप्त करने का कोई तरीका है? कुछ अन्य मुद्दों में मैंने भाग लिया है, मैं "संकलन जांच" करना चाहता हूं:

  • मुझे चेतावनी दें कि क्या मैं एक चर बना देता हूं लेकिन इसका उपयोग नहीं करता हूं। चर नामों में टाइपो की जांच करने में मदद के लिए।
  • सुनिश्चित करें कि कक्षा में कोई विधि मौजूद है, इसलिए मैं विधि नाम टाइपो से बच सकता हूं और रीफैक्टरिंग में भी मदद कर सकता हूं, उदाहरण के लिए यदि मैं किसी विधि का नाम बदलता हूं।

मैं वर्तमान में रेल 2.3.2 और विंडोज़ पर राड्रेल आईडीई के साथ रूबी 1.8.6-27 आरसी 2 का उपयोग कर रहा हूं।

+0

कृपया अपने कोड का परीक्षण करने के बारे में कोई जवाब नहीं है। मेरे पास उपरोक्त कोड खंड के लिए एक यूनिट परीक्षण था और यह विफल रहा (मेरे मैन्युअल परीक्षण के साथ) और मुझे पता नहीं लगा कि क्यों। जो मैं खोज रहा हूं वह रूबी के लिए एक वाक्यविन्यास परीक्षक है जो समान संकुल मानक संकलक पाता है। Thanx। –

+0

ए सी कंपाइलर आपको 4 == 5.5 करने में त्रुटि नहीं देगा। – Chuck

+0

जेटब्रेन रूबी विचार देखें, https://www.jetbrains.com/ruby/ –

उत्तर

0

मुझे मिला सबसे अच्छा समाधान एक आईडीई था जिसने रूबीमाइन जैसे ऑन-द-फ्लाई सिंटैक्स जांच की थी। मुझे यकीन नहीं है कि यह मेरी मूल समस्या का समाधान करेगा, लेकिन इससे मुझे कई अन्य वाक्यविन्यासों को ढूंढने और ठीक करने में मदद मिली है। आपके सुझावों के लिए सभी को धन्यवाद।

5

पहले परीक्षण करें, फिर कोड। यदि आप अपने आवेदन की सभी शाखाओं को कवर करने वाले परीक्षण लिखते हैं, तो आपको आश्वासन मिलता है कि आपका कोड दोनों चलता है और सही परिणाम उत्पन्न करता है।

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

आप किसी ऑब्जेक्ट को संदेश भेजते समय एक विधि को कॉल नहीं करते हैं। ऑब्जेक्ट तब विधि को संभालने के तरीके के बारे में जानने के लिए ज़िम्मेदार है। रेल में इसका उपयोग ActiveRecord में डीबी कॉलम तक पहुंचने के लिए किया जाता है। स्तंभों के लिए कोई विधि नहीं है जब तक कि कॉलम नाम वाले संदेश को ऑब्जेक्ट पर भेजा न जाए।

रूबी में स्टेटिक टाइपिंग बतख टाइपिंग सिस्टम के खिलाफ जाती है। जटिल विरासत/इंटरफ़ेस योजनाओं के बारे में चिंता किए बिना अक्सर पॉलिमॉर्फिज्म मुक्त हो सकता है।

मैं इन सुविधाओं को गले लगाने और परीक्षण

1

रूबी सुरक्षित होना चाहिए नहीं है के माध्यम से अनिश्चितता के लिए क्षतिपूर्ति सुझाव देते हैं। यह आपको किसी भी दो वस्तुओं की तुलना करने देता है, और यही वह जगह है जहां से इसकी अधिकांश शक्तियां आती हैं। ऐसे गतिशील डिजाइन के बिना रेल संभव नहीं होगा।

जावा या सी जैसी संकलित भाषा भी आपको दो वस्तुओं पर == करने से नहीं रोकती है। जैसा कि बेन ने कहा, पहले परीक्षण करना सबसे अच्छा है। जिन संरचनाओं के साथ आप काम कर रहे हैं उनका निरीक्षण करें।

puts object.class 
+0

पी ऑब्जेक्ट, किसी ऑब्जेक्ट का एक और विस्तृत संस्करण डंप करेगा। मिश्रण पी और डाल आमतौर पर डीबग जानकारी प्राप्त करने के लिए एक विजेता है। –

+0

हां। प्रिंट पसंद का मेरा डिबगिंग टूल है। आप वस्तुओं को इंटरैक्टिव रूप से एक्सेस करने के लिए ./script/console का भी उपयोग कर सकते हैं। – mcandre

1

सामान्य में, सबसे अच्छा तरीका है (मैं के बारे में पता) गतिशील/पटकथा भाषाओं के लिए इस प्रकार की समस्या से बचने के लिए है तरीकों के लिए "तर्क" स्थानांतरित करने के लिए: एक तरह से एक रूबी वस्तु के बारे में जानकारी पाने के लिए उपयोग करने के लिए है/आदेश और उनके लिए यूनिट परीक्षण लिखें। असल में, जो भी असफल हो सकता है उसका परीक्षण किया जाना चाहिए। पृष्ठ पर कोड गूंगा तर्क होना चाहिए ... केवल उन वस्तुओं को प्रदर्शित करने के बजाय जो एक निश्चित मानदंड को पूरा करते हैं, इसे सभी वस्तुओं को प्रदर्शित करना चाहिए, और उस विधि से आइटम की उस सूची को प्राप्त करना चाहिए जो केवल प्रदर्शित किए जाने वाले लोगों को लौटाए।

2

रूबी आपको ऑब्जेक्ट के लिए == ऑपरेटर को फिर से परिभाषित करने की अनुमति नहीं देता है।रूबी 1.8 में आप नहीं कर सकते हैं, रूबी 1.9 करना था, लेकिन मैं अपनी कक्षाओं को कोर कक्षाओं के लिए काम नहीं कर पा रहा हूं। यह कस्टम परिभाषित वस्तुओं के लिए अच्छी तरह से काम करता है।

class Object 

    alias :equal_without_warning :== 

    def ==(object) 
    unless self.class == object.class 
     warn("Comparing `#{self.class}' with `#{object.class}'") 
    end 
    equal_without_warning(object) 
    end 

end 

मान लिया जाये कि मैं कुछ बेवकूफ कोडिंग त्रुटि नहीं किया, जवाब नहीं है: क्या आप की जाँच नहीं कर सकते हैं कि क्या आप वस्तुओं के विभिन्न प्रकार की तुलना कर रहे हैं।

इसके अलावा, मैं कहूंगा कि आप नहीं करते हैं। वास्तव में रूबी इस तरह से काम करने के लिए डिज़ाइन नहीं किया गया है, यह रूबी शैली की बजाय एक जावा दृष्टिकोण है।

+0

आपको कोर कक्षाओं के लिए एक ही पुनर्वितरण करना होगा क्योंकि वे सामान्य रूप से ऑब्जेक्ट # == – rampion

0

दो बातें मैं सुझाव चाहते हैं:

एक: आईआरबी (या स्क्रिप्ट/रेल के लिए कंसोल) के बारे में पढ़ें। गतिशील भाषाओं में एक सामान्य विकास अभ्यास "लाइव" दुभाषिया (जैसे आईआरबी या रेल कंसोल) के अंदर कोड के स्निपेट को आज़माने का प्रयास करना है। यह अभ्यास स्मॉलटॉक और लिस्प जैसे शुरुआती गतिशील भाषाओं में वापस चला जाता है। रूबी-डीबग समस्या निवारण समस्याओं के लिए भी वास्तव में उपयोगी है और आपके उदाहरण में त्रुटि का पता लगाने का एक आसान तरीका होगा।

दो: "बतख टाइपिंग" पर पढ़ें। रूबी में "प्रकार" और वेरिएबल्स थोड़ा अलग तरीके से काम करते हैं, क्योंकि कई लोग उन्हें उम्मीद करते हैं। जैसा कि मैं इसे समझता हूं, user.id जैसे चर के पास "प्रकार" नहीं है। मान ने को उपयोगकर्ता द्वारा इंगित किया है। आईडी में एक प्रकार है, लेकिन चर स्वयं नहीं है। मेरा मानना ​​है कि इसका कोई हिस्सा नहीं है कि ऐसा कोई टूल नहीं है जो आपको बताएगा कि कार्यक्रम चलाने से पहले आपकी त्रुटि क्या थी। उन दो चरों की तुलना करना एक त्रुटि नहीं है क्योंकि चर के पास कोई प्रकार नहीं है। user.id आपके प्रोग्राम में उस बिंदु पर एक पूर्णांक को इंगित कर रहा था, लेकिन एक स्ट्रिंग को इंगित करने के लिए user.id को असाइन करना पूरी तरह से कानूनी होगा, जिस बिंदु पर तुलना बहुत अधिक समझ में आएगी। :-)

+0

के संदर्भ में == को फिर से परिभाषित करते हैं, इसके अलावा कोई कारण नहीं है कि आप दो अलग-अलग प्रकारों की तुलना '==' से नहीं कर सकते। – Chuck

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