दिलचस्प पोस्ट
.NET के साथ CSV पार्सिंग विकल्प सरणी के अंतिम तत्व को हटाने के बिना सबसे अच्छा तरीका क्या है? कुशलतापूर्वक MySQLDB SScursor का उपयोग कैसे करें? अपाचे mod_rewrite संभावनाओं के किसी भी संख्या के लिए एक नियम Jquery $ वास्तव में वापस क्या करता है? UIScrollView में UIButton स्पर्श देरी है कौन सा एसक्यूएल क्वेरी बेहतर है, मिलान या पसंद है? एंड्रॉइड एप्लिकेशन में फेसबुक एसडीके से ईमेल आईडी कैसे प्राप्त करें? मैं स्मार्ट-स्क्रीन फ़िल्टर को स्व-हस्ताक्षरित प्रमाणपत्र पर कैसे भरोसा कर सकता / सकती हूं? HTML सबमिट-बटन: अलग मान / बटन-पाठ? एंड्रॉइड में एक और दृश्य के ऊपर एक दृश्य रखते हुए / ओवरलैपिंग (z- इंडेक्स) पायथन सबप्रोसेक्शन। चैक बनाम चेक चेकआउट DOM विशेषता परिवर्तन पर फायरिंग ईवेंट एसडीके संस्करण अपडेट किया गया, क्लासएनॉटफ़ाउंड एक्स्प्शन: एंड्रॉइड। Support.v4.view.ViewPager प्राप्त हो रहा है एंड्रॉइड डिवाइस पर थोक प्रविष्टि

कैसे एक विधि निर्धारित समय पर परिभाषित किया जाता है?

हमने हाल ही में एक समस्या की थी, जहां कई तरह की कमाई हुई थी, एक बैकेंड प्रक्रिया को चलाने में असफल रहा। अब, हम अच्छे छोटे लड़के और लड़कियां थे और प्रत्येक चेक-इन के बाद rake test चलाए थे, लेकिन रेल की पुस्तकालय लोडिंग में कुछ अजीब बातों के कारण, यह केवल तब हुआ जब हम सीधे मोर्गिल से उत्पादन मोड में पहुंचे।

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

वैसे भी, लंबी कहानी छोटी, एक तरीका है, रनटाइम पर, रूबी पूछने के लिए जहां एक विधि परिभाषित की गई है? कुछ ऐसे whereami( :foo ) जैसे कि whereami( :foo ) जो /path/to/some/file.rb line #45 ? इस मामले में, मुझे बता रहा है कि यह वर्ग स्ट्रिंग में परिभाषित किया गया था बेकार होगा, क्योंकि यह कुछ पुस्तकालय द्वारा ओवरलोड किया गया था

मैं अपने प्रोजेक्ट में स्रोत की गारंटी नहीं दे सकता, इसलिए 'def foo' एफू 'def foo' लिहाज से मुझे जरूरी नहीं चाहिए कि मुझे क्या आवश्यकता है, न कि अगर मेरे पास कई def foo , कभी-कभी मुझे पता नहीं चलता जब तक रनटाइम एक I उपयोग हो सकता है

वेब के समाधान से एकत्रित समाधान "कैसे एक विधि निर्धारित समय पर परिभाषित किया जाता है?"

यह वास्तव में देर हो चुकी है, लेकिन यहां बताया गया है कि आपको विधि कहां से परिभाषित किया गया है:

http://gist.github.com/76951

 # How to find out where a method comes from. # Learned this from Dave Thomas while teaching Advanced Ruby Studio # Makes the case for separating method definitions into # modules, especially when enhancing built-in classes. module Perpetrator def crime end end class Fixnum include Perpetrator end p 2.method(:crime) #<Method: Fixnum(Perpetrator)#crime> 

यदि आप रूबी 1.9+ पर हैं, तो आप source_location का उपयोग कर सकते हैं

 require 'csv' p CSV.new('string').method(:flock) # => #<Method: CSV#flock> CSV.new('string').method(:flock).source_location # => ["/path/to/ruby/1.9.2-p290/lib/ruby/1.9.1/forwardable.rb", 180] 

ध्यान दें कि यह सब कुछ पर काम नहीं करेगा, जैसे मूल कंपाइल किए गए कोड विधि कक्षा के पास कुछ सुथरे कार्यों भी हैं, जैसे कि विधि # स्वामी, जिसने फ़ाइल को परिभाषित किया है, जहां फ़ाइल को परिभाषित किया जाता है।

संपादित करें: अन्य उत्तर में __file__ और __line__ और REE के नोट्स को भी देखें, वे भी आसान हैं – wg

आप ऊपर दिए गए समाधान से थोड़ा सा आगे भी जा सकते हैं। रूबी 1.8 एंटरप्राइज़ संस्करण के लिए, Method उदाहरणों पर __file__ और __line__ विधियां हैं:

 require 'rubygems' require 'activesupport' m = 2.days.method(:ago) # => #<Method: Fixnum(ActiveSupport::CoreExtensions::Numeric::Time)#ago> m.__file__ # => "/Users/james/.rvm/gems/ree-1.8.7-2010.01/gems/activesupport-2.3.8/lib/active_support/core_ext/numeric/time.rb" m.__line__ # => 64 

रूबी 1.9 और उससे आगे के लिए, source_location (धन्यवाद जोनाथन!) है:

 require 'active_support/all' m = 2.days.method(:ago) # => #<Method: Fixnum(Numeric)#ago> # comes from the Numeric module m.source_location # show file and line # => ["/var/lib/gems/1.9.1/gems/activesupport-3.0.6/.../numeric/time.rb", 63] 

मैं इस धागा के लिए देर से आ रहा हूँ, और आश्चर्य है कि कोई भी Method#owner उल्लेख नहीं किया है

 class A; def hello; puts "hello"; end end class B < A; end b = B.new b.method(:hello).owner => A 

एक नए समान प्रश्न से मेरे उत्तर की प्रतिलिपि बनाकर जो इस समस्या को नई जानकारी जोड़ता है।

रूबी 1.9 को सोर्स_लोकेशन नामक विधि है:

रूबी स्रोत फाइलनाम और पंक्ति संख्या इस पद्धति या शून्य को शामिल करती है यदि रूबी में इस विधि को परिभाषित नहीं किया गया है (अर्थात देशी)

इसे इस मणि से 1.8.7 में बैकपोर्ट किया गया है:

  • ruby18_source_location

तो आप इस विधि के लिए अनुरोध कर सकते हैं:

 m = Foo::Bar.method(:create) 

और फिर उस विधि के source_location के लिए पूछें:

 m.source_location 

यह फ़ाइल नाम और पंक्ति संख्या के साथ एक सरणी वापस करेगा। ActiveRecord::Base#validates लिए उदाहरण ActiveRecord::Base#validates इस रिटर्न की ActiveRecord::Base#validates करता है:

 ActiveRecord::Base.method(:validates).source_location # => ["/Users/laas/.rvm/gems/ruby-1.9.2-p0@arveaurik/gems/activemodel-3.2.2/lib/active_model/validations/validates.rb", 81] 

कक्षाओं और मॉड्यूल के लिए, रूबी ने समर्थन में निर्मित नहीं किया है, लेकिन वहाँ एक उत्कृष्ट सन्दर्भ है जो किसी दिए गए विधि के लिए फाइल को वापस करने के लिए source_location पर बनाता है या कोई भी वर्ग निर्दिष्ट करने के लिए पहली फ़ाइल नहीं है यदि कोई भी तरीका निर्दिष्ट नहीं किया गया है:

  • रूबी where_is मॉड्यूल

कार्रवाई में:

 where_is(ActiveRecord::Base, :validates) # => ["/Users/laas/.rvm/gems/ruby-1.9.2-p0@arveaurik/gems/activemodel-3.2.2/lib/active_model/validations/validates.rb", 81] 

TextMate के साथ स्थापित मैक पर, यह भी निर्दिष्ट स्थान पर संपादक पॉप अप।

यह मदद कर सकता है लेकिन आपको स्वयं को कोड करना होगा ब्लॉग से चिपकाया:

रूबी एक method_added () कॉलबैक प्रदान करता है जिसे हर बार एक विधि जोड़ा जाता है या क्लास के भीतर पुनः परिभाषित किया जाता है। यह मॉड्यूल वर्ग का हिस्सा है, और हर कक्षा एक मॉड्यूल है। यहां दो संबंधित कॉलबैक भी हैं, जिन्हें method_removed () और method_undefined () कहा जाता है।

http://scie.nti.st/2008/9/17/making-methods-immutable-in-ruby

यदि आप विधि को क्रैश कर सकते हैं, तो आपको एक बैकटास मिलेगा जो आपको बताएगा कि वह कहां है।

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

तरीकों को क्रैश करने के उपयोगी तरीके:

  1. पास nil जहां यह इसे रोकता है – विधि का एक ArgumentError या वर्तमान-वर्तमान NoMethodError को एक नीला वर्ग पर बढ़ा देगा।
  2. यदि आपके पास विधि के ज्ञान के अंदर है, और आप जानते हैं कि बदले में विधि कुछ अन्य विधि कॉल करती है, तो आप दूसरी विधि को ओवरराइट कर सकते हैं, और उसमें उठ सकते हैं

बहुत देर से उत्तर 🙂 लेकिन पहले जवाब मुझे मदद नहीं किया

 set_trace_func proc{ |event, file, line, id, binding, classname| printf "%8s %s:%-2d %10s %8s\n", event, file, line, id, classname } # call your method set_trace_func nil 

आप ऐसा कुछ करने में सक्षम हो सकते हैं:

foo_finder.rb:

  class String def String.method_added(name) if (name==:foo) puts "defining #{name} in:\n\t" puts caller.join("\n\t") end end end 

फिर सुनिश्चित करें कि foo_finder पहले से कुछ के साथ भरी हुई है

 ruby -r foo_finder.rb railsapp 

(मैंने केवल रेल के साथ गड़बड़ कर दी है, इसलिए मुझे बिल्कुल पता नहीं है, लेकिन मुझे लगता है कि इस तरह से इसे शुरू करने का एक तरीका है।)

यह आपको स्ट्रिंग # फ़ू के सभी पुनः परिभाषाओं को दिखाएगा। थोड़ा मेटा-प्रोग्रामिंग के साथ, आप जो फ़ंक्शन आप चाहते हैं उसके लिए आप इसे सामान्यीकृत कर सकते हैं। लेकिन फाइल को पहले भरे जाने की ज़रूरत है जो वास्तव में पुन: परिभाषा करता है

आप हमेशा caller() का उपयोग करके जहां आप कर रहे हैं उसका बैक्रास प्राप्त कर सकते हैं।

हो सकता है कि #source_location यह #source_location मदद कर सकता है कि विधि कहां से आती है।

उदाहरण के लिए:

 ModelName.method(:has_one).source_location 

वापसी

 [project_path/vendor/ruby/version_number/gems/activerecord-number/lib/active_record/associations.rb", line_number_of_where_method_is] 

या

 ModelName.new.method(:valid?).source_location 

वापसी

 [project_path/vendor/ruby/version_number/gems/activerecord-number/lib/active_record/validations.rb", line_number_of_where_method_is]