रूबी में क्लास और क्लास के बीच अंतर क्या है?


112

क्लास और क्लास में क्या अंतर है?


1
आपने बाद कहाँ देखा?
डारिन दिमित्रोव

18
klassआमतौर पर एक वैरिएबल को नाम देने के लिए उपयोग किया जाता है जो एक Classऑब्जेक्ट रखता है (याद रखें कि कक्षाएं भी ऑब्जेक्ट हैं), जैसे कि klass = String। क्या आप उस जगह का स्रोत प्रदान कर सकते हैं जहाँ आपने इसे गहन व्याख्या के लिए देखा है?
चुबास 21

5
नहीं, मैं एक भी स्रोत प्रदान नहीं करना चाहता क्योंकि मैं नहीं चाहता कि यह उस तरह समझाया जाए। मैं इस पर एक बड़ी तस्वीर चाहता हूँ
21

5
कभी कभी, लोगों के लिए उपयोग clazzकरने के बजाय klass(उदाहरण के लिए, पुस्तक "Metaprogramming रूबी" में)।
एंड्रयू ग्रिम

2
टीवी ट्रोप्स में, इसे "Xtreme Kool Letterz" कहा जाएगा (कोई लिंक नहीं - उत्पादकता सुरक्षित नहीं)।
एंड्रयू ग्रिम

जवाबों:


188

classएक कीवर्ड है जो एक नए वर्ग को परिभाषित करने के लिए उपयोग किया जाता है। चूंकि यह एक आरक्षित कीवर्ड है, आप इसे एक चर नाम के रूप में उपयोग करने में सक्षम नहीं हैं। आप चर नाम के रूप में रूबी के कीवर्ड के किसी भी उपयोग नहीं कर सकते, तो आप नामित चरों के लिए सक्षम नहीं होगा defया moduleया ifया end, आदि - classकोई अलग है।

उदाहरण के लिए, निम्नलिखित पर विचार करें:

def show_methods(class)
  puts Object.const_get(class).methods.inspect
end
show_methods "Kernel"

जब आप classएक चर नाम के रूप में उपयोग नहीं कर सकते हैं, तो इस परिणाम को एक त्रुटि में चलाने की कोशिश की जा रही है ।

test.rb:1: syntax error, unexpected kCLASS, expecting ')'
    def show_methods(class)
                          ^
test.rb:2: syntax error, unexpected ')'
      puts Object.const_get(class).methods.inspect

इसे ठीक करने के लिए, हम klassइसके बजाय पहचानकर्ता का उपयोग करेंगे । यह विशेष नहीं है, लेकिन यह पारंपरिक रूप से एक चर नाम के रूप में उपयोग किया जाता है जब आप किसी वर्ग या वर्ग के नाम के साथ काम कर रहे होते हैं। यह ध्वन्यात्मक रूप से समान है, लेकिन चूंकि यह एक आरक्षित कीवर्ड नहीं है, रूबी के पास इसके साथ कोई समस्या नहीं है।

def show_methods(klass)
  puts Object.const_get(klass).methods.inspect
end

show_methods "Kernel"

आउटपुट, जैसा कि अपेक्षित है, है

["method", "inspect", "name", "public_class_method", "chop!"...

आप किसी भी (गैर-आरक्षित) चर नाम का उपयोग कर सकते हैं, लेकिन समुदाय ने उपयोग करने के लिए ले लिया है klass। इसका कोई विशेष जादू नहीं है - इसका अर्थ है "मैं यहाँ 'नाम' वर्ग का उपयोग करना चाहता था, लेकिन मैं नहीं कर सकता, क्योंकि यह एक आरक्षित खोजशब्द है"।

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

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

इस प्रकार, सही वर्तनी है classऔर klass, के बजाय Classऔर Klass। उत्तरार्द्ध स्थिरांक होगा, और दोनों वैध Classऔर Klassनिरंतर नाम हैं, लेकिन मैं स्पष्टता प्रयोजनों के लिए उनका उपयोग करने के खिलाफ सिफारिश करूंगा।


7
खैर, न केवल Classविशेष रूप से एक वैध स्थिर नाम है, यह भी एक मौजूदा है! (
इट्स

1
वाह सुंदर। अब पूरी तरह से समझ लें। धन्यवाद क्रिस! :)
तत्कालीन

1
मुझे लगता है कि klassएक स्थानीय चर के रूप में उपयोग पिकैक्स से आता है - उन्होंने उस नाम का एक-दो उदाहरणों में उपयोग किया, ठीक उसी कारण से जैसा आपने यहां वर्णित किया है।
केन ब्लूम

यह पुराना रूबी संस्करण लागू करना चाहिए। रूबी 1.9.3 के साथobject_instance.class.name == 'Object'
12 अगस्त को अगस्तिन रिडिंगर 20

नहीं, यह अभी भी सटीक है। Object.new का वर्ग वस्तु है, लेकिन Object का वर्ग Class है।
क्रिस हील्ड

22

klassएक रेल (या बल्कि ActiveRecord) विधि भी है । इसका उपयोग संघ की श्रेणी प्राप्त करने के लिए किया जाता है।

जैसा कि लिंक की गई सामग्री में कहा गया है:

class Author < ActiveRecord::Base
  has_many :books
end

Author.reflect_on_association(:books).klass
# => Book

12

klassऔर clazzऔर claszजैसे रचनात्मक मिसाइलें होती हैं जिनका उपयोग आरक्षित शब्द के आसपास होने के लिए किया जाता है class

यह अब तक कम आंखों पर कर्कश उपयोग करने के लिए किया जाएगा class1या clया classXएक जानबूझकर गलत वर्तनी के बजाय या कुछ और।


5

एक एक वर्ग का नाम है और दूसरा डिफ़ॉल्ट रूप से एक अपरिभाषित स्थिरांक है। और उस जोड़ी के लिए जिसे आप देख सकते हैं, classऔर klass, पूर्ववर्ती कक्षाओं को परिभाषित करने के लिए एक कीवर्ड है, जबकि बाद वाला सिर्फ एक पहचानकर्ता है (पात्रों के किसी अन्य स्ट्रिंग की तरह)। इसका उपयोग तब किया जाता है जब आप शब्द "वर्ग" लिखना चाहेंगे, लेकिन ऐसा नहीं कर सकते क्योंकि यह एक आरक्षित कीवर्ड है।


बिंदु क्या है, मेरा मतलब है कि इसका उपयोग क्यों / कैसे किया जाता है, यह आमतौर पर किसके लिए उपयोग किया जाता है?
तत्पश्चात

3
@Sam क्लास परिभाषित कक्षाओं के लिए एक आरक्षित कीवर्ड है। इसलिए यदि आप जेनेरिक क्लास (जैसे मेटाप्रोग्रामिंग) के साथ कुछ करना चाहते हैं, तो आप नहीं लिख सकते class = Kernel.const_get(class_name)। लेकिन आप लिख सकते हैं klass = Kernel.const_get(class_name), और इसका उपयोग "वर्ग" का प्रतिनिधित्व करने के लिए किया जाता है।
थियागो सिलवीरा

2
मुद्दा यह है कि आप 'क्लास' शब्द का प्रयोग 'क्लास' के लिए नहीं कर सकते ... क्योंकि यह एक आरक्षित शब्द है (सर्कुलर लॉजिक, मुझे पता है) इसलिए 'शब्द' की जगह 'सब्स्क्राइब्ड' है। यह कई अन्य भाषाओं, जैसे जावा और C # में एक सामान्य मुहावरा है।
स्कॉट

तो आप गतिशील रूप से कक्षा असाइन कर सकते हैं? क्लैस = ऑब्जेक्ट.क्लास; Klass.new - ऐसा कुछ
तत्कालीन 22

3
@ सैम: इसका उपयोग करना Klassएक खराब विकल्प होगा, क्योंकि अपरकेस अक्षरों से शुरू होने वाले पहचानकर्ता स्थिर होते हैं, इसलिए आप इसे केवल एक बार सेट कर सकते हैं। लेकिन हां, यह सामान्य विचार है।
चक
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.