2012-12-22 30 views
5

कहो मैं कक्षा Player है और मैं अगर एक खिलाड़ी पर हमला किया है एक बूलियन विधि जाँच करना चाहते हैं:माणिक तरीकों में एक प्रश्न चिह्न का उपयोग करना

SyntaxError: (irb):14: syntax error, unexpected '=' 
@attacked? = false 
      ^
     from /usr/bin/irb:12:in `<main>' 

हटाना:

class Player 
    attr_accessor :name, :health, :attacked? 

    def initialize(name) 
    @name = name 
    @health = 100 
    @attacked? = false 
    end 
end 

मैं एक वाक्य रचना त्रुटि मिलती है attacked से प्रश्न चिह्न समस्या को हल करता है, लेकिन मैंने सोचा कि यह मेरे कोड में attacked? रखने के लिए बेहतर सम्मेलन का पालन करेगा। प्रश्न चिह्न से गुजरना एक बड़ा सौदा नहीं है, लेकिन zero? और nil? सम्मेलन क्यों हैं @variables? और def methods?= अमान्य हैं?

+0

'@ हमला 'एक उदाहरण चर है, एक विधि नहीं। '@attacked = false'; ... 'डीफ हमला किया ?; @हमला किया; अंत ' –

+3

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

+0

यह एक अच्छा मुद्दा है। वे सभी गेटर्स हैं। एक प्रश्न चिह्न के साथ एक सेटटर बनाना "हमला किया? =" विधि बनाता है, जो भी अवैध वाक्यविन्यास है। तो मेरे कोड में एक अवैध चर नाम और एक अमान्य विधि नाम भी होगा। – rubyuser1357796

उत्तर

11

ध्यान दें कि यदि आप लाइन बाहर टिप्पणी अपने त्रुटि (@attacked? = false) पैदा कर रहा है, तो आप अभी भी प्रश्न चिह्न से संबंधित एक त्रुटि प्राप्त होगी:

NameError: invalid attribute name `attacked?' 

समस्या यह है कि ? मान्य वर्ण एक में नहीं है चर का नाम। पहली त्रुटि (SyntaxError जो आप देख रहे हैं) पार्स समय पर होती है और तुरंत पकड़ी जाती है। दूसरी त्रुटि तब होती है जब रूबी कोड का मूल्यांकन करने की कोशिश करता है और एक अमान्य वर्ण वाले नाम के साथ एक आवृत्ति चर नहीं बना सकता है।

प्रश्न चिह्न एक विधि नाम के अंत में एक मान्य वर्ण यद्यपि है (वास्तव में वह अपने नाम में कहीं भी एक ? के साथ एक विधि को शामिल करना संभव है, लेकिन आप इस तरह के एक विधि सीधे कॉल नहीं कर सकते हैं) ।

एक तरह से प्राप्त करने के लिए आप क्या चाहते हैं कुछ इस तरह है: प्रश्न चिह्न के बिना attacked

class Player 
    attr_accessor :name, :health, :attacked 
    alias :attacked? :attacked 

    def initialize(name) 
    @name = name 
    @health = 100 
    @attacked = false 
    end 
end 

यह छोड़ देता है, लेकिन एक उपनाम के रूप attacked? कहते हैं।

+0

धन्यवाद! मैंने उपनाम का उपयोग करने के बारे में भी सोचा नहीं था। – rubyuser1357796

3

मैंने पहले एक ही समस्या में भाग लिया है, और कामना की है कि मैं एक पिछला प्रश्न चिह्न के साथ आवृत्ति चर बना सकता हूं। ऐसा लगता है कि रूबी के व्याकरण में एक कोने का मामला है। इस की जाँच करें:

>> 1 ? 2 : 3 
=> 2 
>> 1?2:3 
=> 2 
>> @a = true 
=> true 
>> @a?1:2 
=> 1 
>> a = true 
=> true 
>> a ? 1 : 2 
=> 1 
>> a?1:2 
SyntaxError: (irb):9: syntax error, unexpected ':', expecting $end 

तो ? प्रतीक रूबी के व्याकरण में ओवरलोड हो गया है - यह विधि के नाम के लिए मान्य पहचानकर्ता के भाग के रूप त्रिगुट ऑपरेटर, और के लिए प्रयोग किया जाता है। यह पिछले मामले में अस्पष्टता का कारण बनता है, जहां रुबी का लेक्सर a? को एक टोकन के रूप में काटने का प्रतीत होता है, जो इसे शेष टर्नरी ऑपरेटर को सही तरीके से पार्स करने में असमर्थ रहता है। उदाहरण चर के साथ, यह नहीं हो सकता है।

फिर से, मैं सहमत हूं कि उदाहरण में प्रश्न चिह्नों को अनुमति देने के लिए वेरिएबल नाम बहुत उपयोगी होंगे, निश्चित रूप से टर्नरी ऑपरेटर के कुछ अस्पष्ट उपयोगों को गैर-संदिग्ध उपयोग करने से अधिक मूल्यवान होगा।