Computer >> कंप्यूटर >  >> प्रोग्रामिंग >> Ruby

रूबी में सिंटेक्टिक चीनी विधियां

रूबी मैजिक के एक नए लेख में आपका स्वागत है! इस कड़ी में, हम देखेंगे कि रूबी कैसे सिंटैक्टिक शुगर का उपयोग करती है इसके कुछ वाक्य रचना को अधिक अभिव्यंजक, या पढ़ने में आसान बनाने के लिए। अंत में, हम जानेंगे कि रूबी की कुछ तरकीबें हुड के नीचे कैसे काम करती हैं और अपनी खुद की विधियों को कैसे लिखना है जो इस चीनी का थोड़ा सा उपयोग करते हैं।

रूबी ऐप्स लिखते समय वर्ग विशेषताओं, सरणी और हैश के साथ बातचीत करना आम बात है जो गैर-मानक महसूस कर सकता है। हम ऐरे या हैश से एट्रिब्यूट असाइन करने और मान लाने के तरीकों को कैसे परिभाषित करेंगे?

रूबी इन विधियों को कॉल करते समय काम करने के लिए थोड़ी सी वाक्यात्मक चीनी प्रदान करती है। इस पोस्ट में हम जानेंगे कि यह कैसे काम करता है।

person1 = Person.new
person1.name = "John"
 
array = [:foo, :bar]
array[1]  # => :bar
 
hash = { :key => :foo }
hash[:key] # => :foo
hash[:key] = :value

सिंटेक्टिक शुगर?

सिंटेक्टिक शुगर थोड़ा सा मैजिक रूबी आपको लिखित रूप में पढ़ने में आसान और अधिक संक्षिप्त कोड प्रदान करता है। रूबी में इसका अर्थ है कुछ प्रतीकों, रिक्त स्थान को छोड़ना या किसी प्रकार के सहायक के साथ कुछ अभिव्यक्ति लिखना।

विधि नाम

आइए विधि नामों से शुरू करें। रूबी में, हम विधि नामों के लिए सभी प्रकार के वर्णों और विशेष प्रतीकों का उपयोग कर सकते हैं जो आमतौर पर अन्य भाषाओं में समर्थित नहीं होते हैं। यदि आपने कभी रेल ऐप लिखा है तो आपने शायद save! . का सामना किया हो तरीका। यह रेल के लिए कुछ विशिष्ट नहीं है, लेकिन यह ! . के लिए समर्थन प्रदर्शित करता है रूबी विधि नामों में वर्ण।

वही अन्य प्रतीकों पर लागू होता है जैसे = , [ , ] , ? , % , & , | , < , > , * , - , + और /

इन वर्णों के समर्थन का मतलब है कि हम उन्हें अपने तरीके के नामों में शामिल कर सकते हैं ताकि वे इस बारे में अधिक स्पष्ट हो सकें कि वे किस लिए हैं:

  • एट्रिब्यूट असाइन करना:person.name = "foo"
  • प्रश्न पूछें:person.alive?
  • खतरनाक तरीकों को कॉल करें:car.destroy!
  • वस्तुओं को कुछ ऐसा बनाना जो वे नहीं हैं:car[:wheels]

विशेषता विधियों को परिभाषित करना

attr_accessor . के साथ एक वर्ग पर एक विशेषता को परिभाषित करते समय , रूबी कक्षा में एक आवृत्ति चर के लिए एक पाठक और एक लेखक विधि बनाता है।

class Person
  attr_accessor :name
end
 
person = Person.new
person.name = "John"
person.name # => "John"

हुड के तहत, रूबी दो तरीके बनाती है:

  • Person#name attr_reader . का उपयोग करके कक्षा में विशेषता/आवृत्ति चर पढ़ने के लिए , और;
  • Person#name= attr_writer . का उपयोग करके क्लास पर एट्रिब्यूट/इंस्टेंस वेरिएबल लिखने के लिए ।

अब मान लें कि हम इस व्यवहार को अनुकूलित करना चाहते हैं। हम attr_accessor . का उपयोग नहीं करेंगे सहायक और विधियों को स्वयं परिभाषित करें।

class AwesomePerson
  def name
    "Person name: #{@name}"
  end
 
  def name=(value)
    @name = "Awesome #{value}"
  end
end
 
person = AwesomePerson.new
person.name = "Jane"
person.name # => "Person name: Awesome Jane"

name= . के लिए विधि परिभाषा person.name = "Jane" . विधि को कॉल करते समय आप इसे लगभग उसी तरह लिखेंगे जैसे आप इसे लिखेंगे . हम बराबर चिह्न = . के आस-पास के रिक्त स्थान को परिभाषित नहीं करते हैं और विधि को कॉल करते समय कोष्ठक का प्रयोग न करें।

वैकल्पिक कोष्ठक और रिक्त स्थान

आपने देखा होगा कि रूबी कोष्ठक में बहुत बार वैकल्पिक होते हैं। किसी विधि के लिए तर्क पारित करते समय, हमें तर्क को कोष्ठकों में लपेटने की आवश्यकता नहीं होती है () , लेकिन अगर इसे पढ़ना आसान हो तो हम कर सकते हैं।

if-statement एक अच्छा उदाहरण है। कई भाषाओं में आप अभिव्यक्ति को लपेटते हैं if-statement कोष्ठक के साथ मूल्यांकन करता है। रूबी में, उन्हें छोड़ा जा सकता है।

puts "Hello!" if (true) # With optional parentheses
puts "Hello!" if true   # Without parentheses

वही विधि परिभाषाओं और अन्य अभिव्यक्तियों पर लागू होता है।

def greeting name # Parentheses omitted
  "Hello #{name}!"
end
 
greeting("Robin") # With parentheses
greeting "Robin"  # Without parentheses
greeting"Robin"   # Without parentheses and spaces

अंतिम पंक्ति को पढ़ना मुश्किल है, लेकिन यह काम करती है। कॉल करने के तरीकों में भी कोष्ठक और रिक्त स्थान वैकल्पिक हैं।

बस सावधान रहें कि हर कोष्ठक और स्थान को न छोड़ें, इनमें से कुछ रूबी को यह समझने में मदद करते हैं कि आपका क्या मतलब है! जब संदेह हो, तो अपने तर्कों को कोष्ठकों में लपेटें ताकि आप और रूबी जान सकें कि कौन से तर्क किस विधि कॉल से संबंधित हैं।

विधि को कॉल करने के निम्नलिखित सभी तरीके समर्थित हैं, लेकिन हम आमतौर पर कोष्ठकों को छोड़ देते हैं और कोड को थोड़ा अधिक पठनीय बनाने के लिए रिक्त स्थान जोड़ते हैं।

# Previous method definition:
# def name=(value)
#   @name = "Awesome #{value}"
# end
 
person.name = "Jane"
person.name="Jane"
person.name=("Jane") # That looks a lot like the method definition!

अब हमने name . के लिए कस्टम एट्रिब्यूट रीडर और राइटर विधियों को परिभाषित किया है विशेषता। हम आवश्यकतानुसार व्यवहार को अनुकूलित कर सकते हैं और कॉलबैक का उपयोग करने के बजाय विशेषता निर्दिष्ट करते समय सीधे मूल्य पर परिवर्तन कर सकते हैं।

[ ] को परिभाषित करना तरीके

अगली चीज़ जो हम देखेंगे वो हैं वर्गाकार कोष्ठक विधियाँ [ ] रूबी में। ये आमतौर पर ऐरे इंडेक्स और हैश कुंजियों को मान लाने और असाइन करने के लिए उपयोग किए जाते हैं।

hash = { :foo => :bar, :abc => :def }
hash[:foo]        # => :bar
hash[:foo] = :baz # => :baz
 
array = [:foo, :bar]
array[1] # => :bar

आइए देखें कि इन विधियों को कैसे परिभाषित किया जाता है। कॉल करते समय hash[:foo] हम उस काम को करने के लिए कुछ रूबी सिंटैक्टिक चीनी का उपयोग कर रहे हैं। इसे लिखने का दूसरा तरीका है:

hash = { :foo => :bar }
hash.[](:foo)
hash.[]=(:foo, :baz)
# or even:
hash.send(:[], :foo)
hash.send(:[]=, :foo, :baz)

जिस तरह से हम इसे सामान्य रूप से लिखते हैं उसकी तुलना में (hash[:foo] और hash[:foo] = :baz ) हम पहले से ही कुछ अंतर देख सकते हैं। पहले उदाहरण में (hash.[](:foo) ) रूबी वर्ग कोष्ठक (hash[:foo] . के बीच पहले तर्क को स्थानांतरित करती है ) कॉल करते समय hash.[]=(:foo, :baz) दूसरा तर्क विधि को मान hash[:foo] = :baz के रूप में पास किया जाता है ।

यह जानने के बाद, अब हम अपने [ ] . को परिभाषित कर सकते हैं और [ ]= जिस तरह से रूबी इसे समझ पाएगी।

class MyHash
  def initialize
    @internal_hash = {}
  end
 
  def [](key)
    @internal_hash[key]
  end
 
  def []=(key, value)
    @internal_hash[key] = value
  end
end

अब जब हम जानते हैं कि ये विधियाँ सामान्य रूबी विधियाँ हैं, तो हम उन पर किसी अन्य विधि की तरह ही तर्क लागू कर सकते हैं। हम इसे अजीब चीजें भी कर सकते हैं जैसे [ ] . में एकाधिक कुंजियों को अनुमति दें विधि।

class MyHash
  def initialize
    @internal_hash = { :foo => :bar, :abc => :def }
  end
 
  def [](*keys)
    @internal_hash.values_at(*keys)
  end
end
 
hash = MyHash.new
hash[:foo, :abc] # => [:bar, :def]

अपना खुद का बनाएं

अब जब हम रूबी की वाक्यात्मक चीनी के बारे में कुछ जानते हैं, तो हम इस ज्ञान को कस्टम लेखकों, हैश-जैसी कक्षाओं और अधिक जैसे अपने तरीके बनाने के लिए लागू कर सकते हैं।

आपको आश्चर्य हो सकता है कि कितने रत्न वर्ग कोष्ठक विधियों जैसे तरीकों को परिभाषित करते हैं ताकि कुछ ऐसा महसूस किया जा सके जैसे कि ऐरे या हैश वास्तव में नहीं है। एक उदाहरण रेल एप्लिकेशन में फ्लैश संदेश सेट कर रहा है:
flash[:alert] = "An error occurred" . AppSignal रत्न में हम इसका उपयोग स्वयं Config . पर करते हैं वर्ग विन्यास लाने के लिए एक आशुलिपि के रूप में।

यह रूबी में विधि परिभाषा और कॉलिंग के लिए वाक्यात्मक चीनी पर हमारे संक्षिप्त रूप को समाप्त करता है। हमें यह जानना अच्छा लगेगा कि आपको यह लेख कैसा लगा, यदि इसके बारे में आपके कोई प्रश्न हैं, और आप आगे क्या पढ़ना चाहते हैं, तो हमें @AppSignal पर बताना सुनिश्चित करें।


  1. रूबी में 9 नई सुविधाएँ 2.6

    रूबी का एक नया संस्करण नई सुविधाओं और प्रदर्शन में सुधार के साथ आ रहा है। क्या आप परिवर्तनों के साथ बने रहना चाहेंगे? आइए एक नज़र डालते हैं! अंतहीन रेंज रूबी 2.5 और पुराने संस्करण पहले से ही अंतहीन श्रेणी के एक रूप का समर्थन करते हैं (Float::INFINITY के साथ) ), लेकिन रूबी 2.6 इसे अगले स्तर पर ले

  1. अपने रूबी तरीकों की जासूसी कैसे करें

    रूबी में एक अंतर्निहित अनुरेखण प्रणाली है जिसे आप TracePoint . का उपयोग करके एक्सेस कर सकते हैं कक्षा। कुछ चीज़ें जिन्हें आप ट्रेस कर सकते हैं, वे हैं मेथड कॉल, नए थ्रेड और अपवाद। आप इसका उपयोग क्यों करना चाहेंगे? ठीक है, यदि आप किसी निश्चित विधि के निष्पादन का पता लगाना चाहते हैं तो यह उपयोगी हो

  1. रूबी के ऐरे क्लास का उपयोग कैसे करें (उदाहरण + उपयोगी तरीके)

    एक सरणी क्या है? एक सरणी एक अंतर्निहित रूबी वर्ग है, जिसमें शून्य या अधिक वस्तुओं की सूची होती है , और इसमें वे विधियां शामिल हैं जो इन सभी वस्तुओं को आसानी से जोड़ने, एक्सेस करने और लूप करने में आपकी सहायता करती हैं। यह मददगार है, क्योंकि यदि सरणियाँ मौजूद नहीं होतीं तो आपको कई चरों का उपयोग करना