2012-05-10 14 views
40

उदाहरण के लिए, मुझे निम्न स्निपेट में विधि नाम bundler? मिला, और यह नहीं पता कि ? वर्ण एक विशेष कीवर्ड या विधि नाम का हिस्सा है या नहीं।रुबी में विधि नामों के लिए प्रतिबंध क्या हैं?

# This is a predicate useful for the doc:guides task of applications. 
def bundler? 
    # Note that rake sets the cwd to the one that contains the Rakefile 
    # being executed. 
    File.exists?('Gemfile') 
end 

उत्तर

72

विधि के नाम अपर-केस और छोटे अक्षरों, संख्या हो सकती है, _ रेखांकित और punctation संकेत !, ?, =

एक विधि का नाम किसी संख्या से शुरू नहीं हो सकता है, और वर्ण !, ? और = केवल अंत में दिखाई दे सकते हैं।

गैर-ASCII वर्ण विधि विधि में उपयोग किए जा सकते हैं, लेकिन इससे बहुत भ्रमित परिस्थितियां हो सकती हैं और सामान्य अभ्यास नहीं होना चाहिए।

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

def Capital 
    nil 
end 

Capital # NameError: uninitialized constant Capital 
Capital() # => nil 

कुछ बहुत ही व्यापक रूप से और लगातार सम्मेलनों इस्तेमाल किया जब परिभाषित करने विधि नाम हैं:

  1. विधि नाम, नीचे मामले भरे हुए हैं अंडरस्कोर से _ नाम में शब्दों के लिए विभाजक के रूप में (जैसे Math::sqrt, Array#each_index, ...)।

  2. विधेय एक प्रश्न चिह्न ? के रूप में अंतिम वर्ण (जैसे कि Array#empty?, Hash#has_key?, ...)। भविष्यवाणी करते हैं कि आमतौर पर बूलियन मान वापस आते हैं, यह हमेशा मामला नहीं है: इन विधियों को केवल nil या false वापस करने की आवश्यकता है यदि भविष्यवाणी गलत है, अन्यथा अन्य मूल्य (उदाहरण के लिए File::size?nil देता है यदि फ़ाइल मौजूद नहीं है, तो आकार का आकार अन्यथा Integer के रूप में फ़ाइल करें)।

  3. वे ऑब्जेक्ट्स जो उस ऑब्जेक्ट की स्थिति को संशोधित करते हैं जिस पर उन्हें बुलाया जाता है, या जिनके असामान्य व्यवहार में अंतिम चरित्र के रूप में विस्मयादिबोधक चिह्न ! है; इन तरीकों को कभी-कभी म्यूटेटर कहा जाता है क्योंकि वे आमतौर पर अन्य विधियों के विनाशकारी या इन-प्लेस संस्करण होते हैं (उदा। , Array#slice!, ...)।

  4. Setters बराबर के चिह्न = के रूप में अंतिम वर्ण (जैसे Array#[]=, ...) है; रूबी interpeter सेटर तरीकों में से invokation के लिए वाक्यात्मक चीनी प्रदान करता है:

    a = [4, 5, 6] 
    a[0] = 3 # Shorthand for a.[]=(0, 3) 
    

रूबी भी विधि नाम के रूप में ऑपरेटर प्रतीक का उपयोग ऑपरेटरों को परिभाषित करने की अनुमति देता है:

╔═══════════════════════════╦═════════════════════════════════════════════╦═══════╗ 
║ Operators (by precedence) ║     Operations     ║ Arity ║ 
╠═══════════════════════════╬═════════════════════════════════════════════╬═══════╣ 
║ ! ~ +      ║ Boolean NOT, bitwise complement, unary plus ║  1 ║ 
║       ║ (define with method name [email protected], Ruby 1.9+)  ║  ║ 
║       ║            ║  ║ 
║ **      ║ Exponentiation        ║  2 ║ 
║       ║            ║  ║ 
║ -       ║ Unary minus (define with method name [email protected]) ║  1 ║ 
║       ║            ║  ║ 
║ */%      ║ Multiplication, division, modulo   ║  2 ║ 
║       ║            ║  ║ 
║ + -      ║ Addition, subtraction      ║  2 ║ 
║       ║            ║  ║ 
║ << >>      ║ Bitwise shift        ║  2 ║ 
║       ║            ║  ║ 
║ &       ║ Bitwise AND         ║  2 ║ 
║       ║            ║  ║ 
║ |^      ║ Bitwise OR, Bitwise XOR      ║  2 ║ 
║       ║            ║  ║ 
║ < <= => >     ║ Ordering         ║  2 ║ 
║       ║            ║  ║ 
║ == === != =~ !~ <=>  ║ Equality, pattern matching, comparison  ║  2 ║ 
╚═══════════════════════════╩═════════════════════════════════════════════╩═══════╝ 

एकल ऑपरेटर तरीके हैं कोई तर्क पारित नहीं किया; बाइनरी ऑपरेटर विधियों को एक तर्क पारित किया जाता है, और इस पर और self पर संचालित होता है।

ऑपरेटरों की धैर्य का सख्ती से पालन करना महत्वपूर्ण है; जबकि ऑपरेटर विधियों को एक अलग धैर्य के साथ परिभाषित करना संभव है (उदा। + विधि जो दो तर्क लेती है), रूबी आपको ऑपरेटर सिंटैक्स के साथ विधि को कॉल करने की अनुमति नहीं देगी (हालांकि यह डॉट सिंटैक्स के साथ काम करेगी)।

जितना संभव हो सके ऑपरेटरों के मूल अर्थशास्त्र का पालन करना अच्छा अभ्यास है: यह किसी ऐसे व्यक्ति के लिए सहज होना चाहिए जो ऑपरेटर के मूल अर्थ को जानता है कि यह उपयोगकर्ता परिभाषित कक्षाओं के साथ कैसे काम करता है।

भाषा विशेष, गैर-ऑपरेटर, [] विधि के लिए सिंटैक्टिक चीनी भी प्रदान करती है जो आमतौर पर सरणी और हैश मानों तक पहुंचने के लिए उपयोग की जाती है। [] विधि मनमानी धैर्य के साथ परिभाषित किया जा सकता है।

तालिका में हर द्विआधारी ऑपरेटर, आदेश, समानता, तुलना और पैटर्न मिलान को छोड़कर के लिए, रूबी भी संक्षिप्त काम के लिए आशुलिपि प्रदान करता है (उदाहरण के लिए x += yx = x + y तक विस्तारित है); आप उन्हें विधियों के रूप में परिभाषित नहीं कर सकते हैं, लेकिन आप अपने व्यवहार को उन ऑपरेटरों को परिभाषित कर सकते हैं जिन पर वे आधारित हैं।

इन वर्णों में से कोई भी सामान्य विधि नामों के अंदर उपयोग नहीं किया जा सकता है (उदा। do&print या start-up वैध विधि नाम नहीं हैं)।

+1

शानदार उत्तर! एक छोटे से नोट के रूप में: यह वास्तविक तरीकों ('' '' के साथ) झूठी ('शून्य 'या' झूठी') या truethy (बाकी सब कुछ) मान वापस करने के लिए प्रथागत है, आवश्यक 'सत्य' और 'झूठी' नहीं है। वापसी मूल्य का उद्देश्य 'if' कथन में किया जाना है, जहां यह व्यवहार करता है जैसे कि यह 'सत्य' और 'झूठा' था, लेकिन वास्तविक वापसी मूल्य अक्सर इच्छित विधि इंटरफ़ेस का हिस्सा नहीं होता है, केवल यह सत्य या गलत संपत्ति है। –

+0

सलाह के लिए धन्यवाद, मैंने तदनुसार संपादित किया। –

+0

कुछ वर्ण भी हैं जिन्हें केवल संपूर्ण विधि नाम के रूप में उपयोग किया जा सकता है, यानी आप + * **/(यदि आप उन ऑपरेटरों को अधिभारित कर रहे हैं) नामक विधियों को परिभाषित कर सकते हैं, लेकिन foo + bar –

0

अक्षर स्वीकृत हैं: a-Z,, 0-9 जब तक शुरुआत, _, और ? (बूलियन कार्यों के लिए) और ! (विनाशकारी कार्यों के लिए) और = (setters के लिए) पर के रूप में नहीं।

2

विधि नाम !, ? या = में समाप्त हो सकते हैं। अंडरस्कोर भी अनुमति है। इसके अलावा ऑपरेटरों की तरह दिखने वाली कई विधियां हैं (उदा। +, *, >>, []) कि आप अपनी कक्षाओं के लिए परिभाषित कर सकते हैं।

रूबी में
4

दूसरों क्या कहते हैं के लिए सच है निर्मित वाक्य रचना, लेकिन वहाँ अगर तुम तरीकों का उपयोग किया जा सकता है क्या पर कोई बैक-एंड प्रतिबंध हो रहा है define_method तरह + send:

define_method(:'$% ^&') { 0 } 
define_method(:'你好') { 1 } 

send(:'$% ^&') == 0 or raise 
send(:'你好') == 1 or raise 

यह कर सकते हैं तथ्य यह है उपयोगी हो: उदाहरण के लिए रेल 'ActiveSupport::Testing::Declarative.test विधि का उपयोग करता है तो के रूप में पर जटिल रूपांतरण करने के लिए नहीं: एक saner नाम है, जो नामक एक अन्य परीक्षण के प्रतिकूल हो सकती करने के लिए

test 'Some Controller#Method' do 

:

test 'Some Controller_Method' do 

यह Testing Guide पर उल्लिखित है।

जिज्ञासा: Why does the JVM allow us to name a function starting with a digit in bytecode?

2

एक बात को जोड़ने के लिए: एक ऐसी ही बात जावा, जहां बाईटकोड विधि नाम जावा भाषा की तुलना में जिस तरह से और अधिक विकल्प देता है में क्या होता है आप भी के साथ एक विधि को चलाने के लिए एक वस्तु बता सकते हैं कोई सभी में नाम है और यह एक विधि नामित call आह्वान करने की कोशिश करेंगे:

#!/usr/bin/env ruby 

class Foo 

=begin 
    def call(*args) 
    puts "received call with #{args.join(' ')}" 
    end 
=end 

    def method_missing(m, *args, &block) 
    puts "received method_missing on `#{m}(#{args.join(', ')})`" 
    end 

end 

f = Foo.new 
f.('hi')    # Not a syntax error! method_missing with m of :call 
f.send :'', 'hmm' # method_missing with m set to :'' 
f.send nil, 'bye' # raises an error 

वहाँ वास्तव में किसी भी विधि callObject पर परिभाषित का नाम नहीं है, लेकिन वहां Method औरपर एक हैकक्षाएं

कुछ भाषाओं में () फ़ंक्शन आमंत्रण के लिए एक ऑपरेटर है, और ऐसा लगता है कि यहां क्या हो रहा है।

इसका उपयोग किया जाता है उदा। रेल 'JBuilder में:

https://github.com/rails/jbuilder

यह ओ रेली रूबी पुस्तक के पृष्ठ 196 पर दर्ज है:

रूबी 1.9 एक Proc वस्तु आह्वान करने के लिए एक अतिरिक्त तरीका प्रदान करता है; के रूप में एक विकल्प के कोष्ठक वर्ग, आप एक अवधि के साथ उपसर्ग कोष्ठक का उपयोग कर सकते हैं:

z = f.(x,y) 

.() एक विधि मंगलाचरण विधि का नाम गुम तरह दिखता है। यह एक ऑपरेटर नहीं है जिसे परिभाषित किया जा सकता है, बल्कि सिंटैक्टिक-चीनी है जो call विधि का आह्वान करता है। इसका उपयोग किसी भी ऑब्जेक्ट के साथ किया जा सकता है जो call विधि को परिभाषित करता है और Proc ऑब्जेक्ट्स तक सीमित नहीं है।

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