2012-05-18 13 views
5

रूबी पूरी तरह ऑब्जेक्ट उन्मुख भाषा है। रूबी में, सब कुछ एक वस्तु & है, इसलिए, कुछ वर्ग से संबंधित है। उदाहरण के लिए 5 अंतर्गत आता है करने के लिए Object classरूबी वास्तव में पूरी तरह ऑब्जेक्ट उन्मुख भाषा है?

1.9.3p194 :001 > 5.class 
=> Fixnum 
1.9.3p194 :002 > 5.class.superclass 
=> Integer 
1.9.3p194 :003 > 5.class.superclass.superclass 
=> Numeric 
1.9.3p194 :005 > 5.class.superclass.superclass.superclass 
=> Object 
1.9.3p194 :006 > 5.class.superclass.superclass.superclass.superclass 
=> BasicObject 
1.9.3p194 :007 > 5.class.superclass.superclass.superclass.superclass.superclass 
=> nil 

हां, तो हम Object_name#method_name में के रूप में वर्ग/ऑब्जेक्ट नाम लगाकर द्वारा सभी तरीकों कॉल करने के लिए की है। उदाहरण:

5.times{|i| puts i} 

अब, रेल stylesheet_link_tag, javascript_include_tag, form_for आदि की तरह इन तथाकथित सहायकों जो इस Object_name#method_name वाक्य रचना का पालन करते हैं, तो मैं लगता है कि वे सिर्फ सामान्य कार्यों हैं।

तो मेरे सवाल का

  1. क्या इन रेल सहायकों हो रहा है?
  2. यदि वे सिर्फ & कार्य करते हैं तो किसी भी वर्ग से प्राप्त नहीं होता है। क्या कहने वाले दावे का खंडन नहीं करता है - रुबी में, everything a object & there are no primitives। उदाहरण के तौर पर, लोग 5.+(6) का हवाला देते हुए कहते हैं कि ऑपरेटरों को केवल सादा तरीकों हैं?
+1

प्रदान करने के लिए जब आप स्पष्ट रिसीवर के बिना विधि मंगलाचरण देखते हैं, तो रिसीवर 'self' है संपादित करेंगे। आपने वास्तव में निष्कर्ष निकाला कि "सब कुछ एक वस्तु है" सच नहीं है? –

+0

ओह, मुझे 'आत्म' के बारे में पता नहीं था। मुझे लगता है कि मैं गलत था, धन्यवाद! – CuriousMind

+1

मैं इसे उत्तर में अपग्रेड कर दूंगा :) –

उत्तर

8

अन्य बातों के एक रिसीवर के बिना कहा जाता है के लिए, Kernel मॉड्यूल, जहां puts की तरह सामान परिभाषित किया गया है देखो। चूंकि मॉड्यूल Object में शामिल है, इसकी विधियां हर जगह उपलब्ध हैं। आईएमएचओ का उपयोग कितना सटीक होगा - दावा करें कि सबकुछ एक वस्तु है?

+0

तो कक्षाओं के बजाय, इन विधियों को मॉड्यूल में परिभाषित किया गया है? आपका जवाब दिन का मेरा * आह * क्षण बन गया है। दिलचस्प! – CuriousMind

4

जब आप स्पष्ट रिसीवर के बिना विधि आमंत्रण देखते हैं, तो रिसीवर self है। ऑब्जेक्ट कई तरीकों से तरीकों को प्राप्त कर सकते हैं। एक, सबसे स्पष्ट, यह है कि जब आप स्वयं विधियों को परिभाषित करते हैं। फिर आप मॉड्यूल भी शामिल कर सकते हैं।

class Person 
    # this adds a bunch of methods to Person, making it a Mongoid model 
    include Mongoid::Document 
end 

आपके द्वारा शामिल मॉड्यूल और आपके द्वारा प्राप्त कक्षाओं को समान तरीके से कार्यक्षमता प्राप्त कर सकते हैं।

तो, जब आप रिसीवर के बिना विधि देखते हैं, तो सोचें "इस बिंदु पर self क्या है? इसकी कक्षा क्या है? इसमें किस तरीके से परिभाषित किया गया है? इसमें कौन से मॉड्यूल शामिल हैं?" आप रूबी और रेल के बारे में कई रोचक चीजें खोज लेंगे। :)

5

ये रेल संपत्ति टैग टैगर्स एक्शन व्यू, ActionView::Helpers::AssetTagHelper का एक उप मॉड्यूल है जो HTML उत्पन्न करने के तरीकों को प्रदान करता है जो छवियों, जावास्क्रिप्ट, स्टाइलशीट्स और फ़ीड जैसी संपत्तियों को देखता है।

modules के रूप में एक सुपर क्लास के रूप में class है तो इसका मतलब यह AssetTagHelpers भी यह

irb(main):016:0> ActionView::Helpers::AssetTagHelper 
=> ActionView::Helpers::AssetTagHelper 
irb(main):017:0> ActionView::Helpers::AssetTagHelper.class 
=> Module 
irb(main):018:0> ActionView::Helpers::AssetTagHelper.class.superclass 
=> Object 
irb(main):019:0> ActionView::Helpers::AssetTagHelper.class.superclass.superclass 
=> BasicObject 
irb(main):020:0> ActionView::Helpers::AssetTagHelper.class.superclass.superclass.superclass 
=> nil 

नोट होगा: सादगी मैं केवल JavascriptIncludeTag पर ध्यान दिया जाएगा रखने के लिए लेकिन वे सभी बहुत समान हैं।

यहाँ आप एक वर्ग ActionView::Helpers::AssetTagHelper::JavascriptIncludeTag

कहा जाता है जो तुम दृष्टांत

JavascriptIncludeTag.new(config, asset_paths) 

JavascriptIncludeTag वर्ग एक विधि asset_tag कहा जाता है जो फिर एक content_tag प्रणाली को बुलाती है और सही टैग रिटर्न है हो सकता है मिल जाएगा।

पथ: /actionpack/lib/action_view/helpers/asset_tag_helpers/javascript_tag_helpers.rb

require 'action_view/helpers/asset_tag_helpers/asset_include_tag' 

# NOTE: on the 'action_view/helpers/asset_tag_helpers/asset_include_tag' it requires '/actionpack/lib/action_view/helpers/tag_helper.rb' so now all this files are connected :) 
. 
. 
. 
def asset_tag(source, options) 
    content_tag("script", "", { "src" => path_to_asset(source) }.merge(options)) 
end 

पथ: /actionpack/lib/action_view/helpers/tag_helper.rb

def content_tag(name, content_or_options_with_block = nil, options = nil, escape = true, &block) 
    if block_given? 
    options = content_or_options_with_block if content_or_options_with_block.is_a?(Hash) 
    content_tag_string(name, capture(&block), options, escape) 
    else 
    content_tag_string(name, content_or_options_with_block, options, escape) 
    end 
end 

ताकि वे कितना कम काम करते हैं।

नोट: यदि आप मेरी स्पष्टीकरण पाया तो आपको थोड़ी सूझबूझ से बस मुझे सूचित करें और मैं एक बेहतर स्पष्टीकरण

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