रूबी में स्ट्रक्चर क्या है?
एक संरचना एक अंतर्निहित रूबी वर्ग है, इसका उपयोग नए वर्ग बनाने के लिए किया जाता है जो मूल्य वस्तुओं का उत्पादन करते हैं। संबंधित विशेषताओं को एक साथ संग्रहीत करने के लिए एक मूल्य वस्तु का उपयोग किया जाता है।
यहां एक उदाहरण दिया गया है :
एक Point
दो निर्देशांकों के साथ (x
और y
)।
आप इस डेटा को कई अलग-अलग तरीकों से प्रस्तुत कर सकते हैं।
पसंद करें :
- एक सरणी
[10, 20]
- एक हैश
{ x: 10, y: 10 }
- एक वस्तु
Point.new(10, 20)
यदि आपके पास एक से अधिक Point
होने जा रहे हैं , वस्तु दृष्टिकोण का उपयोग करना अक्सर एक अच्छा अभ्यास होता है।
लेकिन…
आप केवल इन दो मानों को एक साथ संग्रहीत करने के लिए एक पूरी कक्षा नहीं बनाना चाहते हैं!
Struct
का उपयोग करना इस समस्या को हल करता है।
सामग्री
- 1 रूबी में स्ट्रक्चर कैसे बनाएं
- 1.1 वैकल्पिक तरीका
- 1.2 बड़ा लाभ
- 2 रूबी स्ट्रक्चर्स का उपयोग कैसे करें
- 3 चेतावनी:संरचनाएं मुश्किल हो सकती हैं
- 3.1 एक और अजीब बात
- रूबी 2.5 में 4 नामित पैरामीटर
- 5 ओपनस्ट्रक्चर का उपयोग कैसे करें
- 6 स्ट्रक्चर बनाम ओपनस्ट्रक्चर
- 7 वीडियो ट्यूटोरियल देखें
- 8 निष्कर्ष
- 8.1 संबंधित
चलो यह करते हैं!
रूबी में स्ट्रक्चर कैसे बनाएं
आप एक Struct
बना सकते हैं new
. पर कॉल करके &प्रतीकों की एक सूची में पास करना जो इस वर्ग के उदाहरण चर बन जाएंगे।
उनके पास पढ़ने और लिखने दोनों के लिए डिफ़ॉल्ट रूप से परिभाषित एक्सेसर विधियां होंगी।
यहां एक उदाहरण दिया गया है :
Person = Struct.new(:name, :age, :gender)
अब आप इस तरह के ऑब्जेक्ट बना सकते हैं :
john = Person.new "john", 30, "M" david = Person.new "david", 25, "M"
वैकल्पिक तरीका
आपको जंगली में संरचनाएँ बनाने का यह दूसरा तरीका मिल सकता है।
ऐसा दिखता है :
class Person < Struct.new(:name, :age, :gender) end
मैं इसकी अनुशंसा नहीं करता।
लेकिन अगर आप इसे वहां ढूंढते हैं तो आप जानते हैं कि यह क्या करता है।
बड़ा लाभ
संरचनाओं के बारे में एक अच्छी बात यह है कि आप उनकी विशेषताओं के आधार पर उनकी तुलना सीधे कर सकते हैं।
उदाहरण :
john == john # true
यदि यह एक नियमित रूबी वस्तु थी तो आपको ==
. को परिभाषित करना होगा विधि स्वयं।
इसे हम "वैल्यू ऑब्जेक्ट" कहते हैं।
रूबी स्ट्रक्चर्स का उपयोग कैसे करें
किसी सरणी या हैश पर किसी संरचना का उपयोग करने से एक प्रमुख लाभ यह है कि आप विधियों का उपयोग करके संरचना सदस्यों तक पहुँच प्राप्त कर सकते हैं।
उदाहरण के लिए :
puts john.age # 30 puts david.gender # "M"
यह मददगार है क्योंकि यदि आपके पास वस्तुओं की एक सरणी है, तो आप max
. जैसी विधियों का उपयोग कर सकते हैं , select
, sum
, आदि.
उदाहरण :
[john, david].max_by(&:age)
बढ़िया!
चेतावनी:संरचनाएं मुश्किल हो सकती हैं
स्ट्रक्चर-जनरेटेड क्लासेस के साथ एक और चेतावनी यह है कि...
वे कंस्ट्रक्टर के लिए तर्कों की सही संख्या लागू नहीं करेंगे!
मुझे समझाएं।
एक उचित वर्ग के साथ आपको यह त्रुटि दिखाई देगी:
ArgumentError: wrong number of arguments (0 for 3)
लेकिन अगर आप एक Struct
. का उपयोग कर रहे हैं लापता तर्क शून्य होंगे:
Person.new("peter") # struct Person name="peter", age=nil, gender=nil
Struct
. के साथ काम करते समय इसे ध्यान में रखें ऑब्जेक्ट!
एक और अजीब बात
इस पर एक नजर...
Struct.new(:a).ancestors [#<Class:0x29b1040>, Struct, Enumerable, Object, Kernel, BasicObject]
यह #<Class:0x29b1040>
structs में जोड़ा गया एक अज्ञात वर्ग है, गणना करने योग्य मॉड्यूल को भी नोटिस करें, जो आपको प्रत्येक और मानचित्र जैसी विधियों को कॉल करने की अनुमति देता है।
रूबी 2.5 में नामित पैरामीटर
मान लें कि आप किसी फ़ाइल की पंक्तियाँ पढ़ रहे हैं और प्रत्येक पंक्ति एक आइटम का प्रतिनिधित्व करती है।
उदाहरण :
200 /login 18:00 404 /bacon 18:03 200 /books 18:04
यदि आप एक कस्टम वर्ग बनाते हैं तो आप इस डेटा के साथ अधिक आसानी से काम करते हैं।
इसे पसंद करें :
LogEntry = Struct.new(:status, :url, :time) LogEntry.new(200, '/books', '18:04')
लेकिन यह और स्पष्ट करने के लिए कि प्रत्येक तर्क क्या दर्शाता है, आप कीवर्ड तर्कों का उपयोग करना चाह सकते हैं।
अच्छी खबर!
रूबी 2.5 ने Struct
. में कीवर्ड तर्कों के लिए समर्थन जोड़ा वस्तुओं।
यहां इसका उपयोग करने का तरीका बताया गया है :
LogEntry = Struct.new(:status, :url, :time, keyword_init: true) LogEntry.new(status: 200, url: '/books', time: '18:04')
अब आप अपनी फ़ाइल को पार्स कर सकते हैं और उसे LogEntry
. में बदल सकते हैं ऑब्जेक्ट!
ओपनस्ट्रक्चर का उपयोग कैसे करें
यदि आपको केवल एक बार की वस्तु की आवश्यकता है, तो आपको OpenStruct
. का उपयोग करने पर विचार करना चाहिए इसके बजाय।
कोड उदाहरण :
require 'ostruct' cat = OpenStruct.new(color: 'black') puts cat.class puts cat.color
ध्यान दें कि आपको ostruct
की आवश्यकता कैसे होती है इस वर्ग तक पहुंच प्राप्त करने के लिए।
चेतावनी:इस reddit टिप्पणी पर schneems के अनुसार, OpenStruct धीमा है और आपको इसे उत्पादन ऐप्स पर उपयोग नहीं करना चाहिए। इसके अलावा मुझे यह ब्लॉग पोस्ट मिला है जिसमें कुछ बेंचमार्क इसका समर्थन करते हैं।
स्ट्रक्चर बनाम ओपनस्ट्रक्चर
Struct
. के बीच का अंतर &OpenStruct
:
- संरचना एक नई कक्षा बनाती है पूर्वनिर्धारित विशेषताओं के साथ, समानता विधि (==) और गणना योग्य
- ओपनस्ट्रक्चर एक नई वस्तु बनाता है दी गई विशेषताओं के साथ
एक OpenStruct
एक फैंसी हैश वस्तु है, जबकि एक Struct
एक टेम्पलेट से एक नया वर्ग बनाने जैसा है।
वीडियो ट्यूटोरियल देखें
निष्कर्ष
आपने रूबी स्ट्रक्चर और ओपनस्ट्रक्चर के बारे में सीखा है! जब तक आप इनमें से प्रत्येक वर्ग की विशेष विशेषताओं से अवगत रहेंगे, तब तक आप ठीक रहेंगे।
अब अभ्यास करने की आपकी बारी है 🙂