रूबी के पास क्या है कि पायथन नहीं करता है, और इसके विपरीत?


263

पाइथन बनाम रूबी की बहुत चर्चा है, और मैं उन सभी को पूरी तरह से अप्रसन्न पाता हूं, क्योंकि वे सभी इस बात की ओर मुड़ जाते हैं कि फीचर X को भाषा Y में क्यों चूसना है, या यह दावा कि भाषा Y में X नहीं है, हालांकि वास्तव में यह करता है। मुझे यह भी पता है कि मैं पायथन को क्यों पसंद करता हूं, लेकिन यह व्यक्तिपरक भी है, और किसी को भी चुनने में मदद नहीं करेगा, क्योंकि उनके पास विकास में समान स्वाद नहीं हो सकता है जैसा कि मैं करता हूं।

इसलिए, मतभेदों को सूचीबद्ध करना दिलचस्प होगा। तो कोई "पायथन के लंबोदर चूसता है"। इसके बजाय यह समझाएं कि रूबी का मेमना पाइथन के नहीं कर सकता। कोई व्यक्तिपरकता नहीं। उदाहरण कोड अच्छा है!

कृपया एक उत्तर में कई अंतर न रखें। और उन लोगों को वोट दें जिन्हें आप जानते हैं कि वे सही हैं, और जो आप जानते हैं वे गलत हैं (या व्यक्तिपरक हैं)। इसके अलावा, सिंटैक्स में अंतर दिलचस्प नहीं है। हम जानते हैं कि पायथन इंडेंटेशन के साथ करता है जो रूबी कोष्ठक और सिरों के साथ करता है, और उस @ को पायथन में स्वयं कहा जाता है।

अद्यतन: यह अब एक सामुदायिक विकि है, इसलिए हम यहाँ बड़े अंतर जोड़ सकते हैं।

रूबी का क्लास बॉडी में क्लास रेफरेंस है

रूबी में आपके पास कक्षा शरीर में पहले से ही कक्षा (स्वयं) का संदर्भ है। पायथन में आपके पास क्लास का एक संदर्भ नहीं है जब तक कि क्लास का निर्माण पूरा नहीं हो जाता है।

एक उदाहरण:

class Kaka
  puts self
end

इस मामले में स्वयं वर्ग है, और यह कोड "काका" को प्रिंट करेगा। पायथन में क्लास डेफिनिशन बॉडी से क्लास के नाम या अन्य तरीकों से प्रिंट करने का कोई तरीका नहीं है (बाहर विधि परिभाषाएँ)।

रूबी में सभी वर्ग परस्पर मिलते हैं

इससे आप कोर कक्षाओं में एक्सटेंशन विकसित कर सकते हैं। यहां रेल एक्सटेंशन का एक उदाहरण दिया गया है:

class String
  def starts_with?(other)
    head = self[0, other.length]
    head == other
  end
end

अजगर (कल्पना करें कि कोई ''.startswithविधि नहीं थी ):

def starts_with(s, prefix):
    return s[:len(prefix)] == prefix

आप इसे किसी भी क्रम पर उपयोग कर सकते हैं (केवल तार नहीं)। ताकि इसे उपयोग करने के लिए आप इसे आयात करना चाहिए स्पष्ट रूप से , उदाहरण के लिए from some_module import starts_with

रूबी में पर्ल जैसी स्क्रिप्टिंग सुविधाएँ हैं

रूबी के पास प्रथम श्रेणी के रेग्जैक्स, $ -विरैबल्स, लाइन इनपुट लूप द्वारा awk / perl लाइन और अन्य विशेषताएं हैं जो इसे छोटे शेल स्क्रिप्ट लिखने के लिए अधिक अनुकूल बनाती हैं जो पाठ फ़ाइलों को मून करती हैं या अन्य कार्यक्रमों के लिए गोंद कोड के रूप में कार्य करती हैं।

रूबी में प्रथम श्रेणी में निरंतरता है

Callcc स्टेटमेंट के लिए धन्यवाद। पायथन में आप विभिन्न तकनीकों द्वारा निरंतरता बना सकते हैं, लेकिन भाषा के लिए निर्मित कोई समर्थन नहीं है।

रूबी में ब्लॉक हैं

"डू" स्टेटमेंट के साथ आप रूबी में एक बहु-पंक्ति अनाम फ़ंक्शन बना सकते हैं, जिसे विधि के सामने एक तर्क के रूप में पारित किया जाएगा, और वहां से बुलाया जाएगा। पायथन में आप इसके बजाय एक विधि पारित करके या जनरेटर के साथ करेंगे।

माणिक:

amethod { |here|
    many=lines+of+code
    goes(here)
}

पायथन (रूबी ब्लॉक अजगर में विभिन्न निर्माणों के अनुरूप हैं):

with amethod() as here: # `amethod() is a context manager
    many=lines+of+code
    goes(here)

या

for here in amethod(): # `amethod()` is an iterable
    many=lines+of+code
    goes(here)

या

def function(here):
    many=lines+of+code
    goes(here)

amethod(function)     # `function` is a callback

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

माणिक:

def themethod
    yield 5
end

themethod do |foo|
    puts foo
end

अजगर:

def themethod():
    yield 5

for foo in themethod():
    print foo

हालांकि सिद्धांत अलग हैं, परिणाम हड़ताली समान है।

रूबी कार्यात्मक शैली (पाइप जैसी) प्रोग्रामिंग का अधिक आसानी से समर्थन करता है

myList.map(&:description).reject(&:empty?).join("\n")

अजगर:

descriptions = (f.description() for f in mylist)
"\n".join(filter(len, descriptions))

पायथन में बिल्ट-इन जनरेटर हैं (जो कि ऊपर बताए अनुसार रूबी ब्लॉक की तरह उपयोग किए जाते हैं)

पायथन को भाषा में जनरेटर के लिए समर्थन है। रूबी 1.8 में आप जनरेटर मॉड्यूल का उपयोग कर सकते हैं जो एक ब्लॉक से जनरेटर बनाने के लिए निरंतरता का उपयोग करता है। या, आप बस एक ब्लॉक / proc / lambda का उपयोग कर सकते हैं! इसके अलावा, रूबी में 1.9 फाइबर हैं, और जनरेटर के रूप में इस्तेमाल किए जा सकते हैं, और एन्युमरेटर क्लास एक निर्मित जनरेटर 4 है

docs.python.org का यह जनरेटर उदाहरण है:

def reverse(data):
    for index in range(len(data)-1, -1, -1):
        yield data[index]

इसके विपरीत उपरोक्त ब्लॉक उदाहरणों के साथ।

पायथन में लचीला नाम स्थान हैंडलिंग है

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

पायथन में, फ़ाइल एक मॉड्यूल है, और आप इसके निहित नामों को आयात कर सकते हैं from themodule import *, जिससे यदि आप चाहें तो नाम स्थान को प्रदूषित कर सकते हैं। लेकिन आप केवल चयनित नामों के साथ भी आयात कर सकते हैं from themodule import aname, anotherया आप बस import themoduleऔर फिर नामों को एक्सेस कर सकते हैं themodule.aname। यदि आप अपने नाम स्थान में अधिक स्तर चाहते हैं, तो आपके पास पैकेज हो सकते हैं, जो मॉड्यूल और __init__.pyफ़ाइल के साथ निर्देशिकाएं हैं ।

अजगर के पास डॉकस्ट्रिंग्स हैं

Docstrings वे तार होते हैं जो मॉड्यूल, फ़ंक्शंस और विधियों से जुड़े होते हैं और रनटाइम में इन्ट्रोस्पेक्ट किए जा सकते हैं। यह मदद कमांड और स्वचालित प्रलेखन के रूप में ऐसी चीजें बनाने में मदद करता है।

def frobnicate(bar):
    """frobnicate takes a bar and frobnicates it

       >>> bar = Bar()
       >>> bar.is_frobnicated()
       False
       >>> frobnicate(bar)
       >>> bar.is_frobnicated()
       True
    """

रूबी के समकक्ष javadocs के समान हैं, और इसके भीतर विधि के ऊपर स्थित है। उन्हें 1.9 की विधि # source_location उदाहरण के उपयोग से फ़ाइलों से रनटाइम पर पुनर्प्राप्त किया जा सकता है

पायथन में कई विरासत हैं

रूबी नहीं ("उद्देश्य पर" - रूबी की वेबसाइट देखें , यहां देखें कि यह रूबी में कैसे किया गया है )। यह अमूर्त वर्गों के एक प्रकार के रूप में मॉड्यूल अवधारणा का पुन: उपयोग करता है।

पायथन की सूची / तानाशाही समझ है

अजगर:

res = [x*x for x in range(1, 10)]

माणिक:

res = (0..9).map { |x| x * x }

अजगर:

>>> (x*x for x in range(10))
<generator object <genexpr> at 0xb7c1ccd4>
>>> list(_)
[0, 1, 4, 9, 16, 25, 36, 49, 64, 81]

माणिक:

p = proc { |x| x * x }
(0..9).map(&p)

पायथन 2.7+ :

>>> {x:str(y*y) for x,y in {1:2, 3:4}.items()}
{1: '4', 3: '16'}

माणिक:

>> Hash[{1=>2, 3=>4}.map{|x,y| [x,(y*y).to_s]}]
=> {1=>"4", 3=>"16"}

अजगर में सज्जाकार होते हैं

डेकोरेटर्स के समान चीजें भी रूबी में बनाई जा सकती हैं, और यह भी तर्क दिया जा सकता है कि वे पायथन के रूप में आवश्यक नहीं हैं।

सिंटेक्स मतभेद

रूबी को अपने सभी स्कोप को बंद करने के लिए "एंड" या "}" की आवश्यकता होती है, जबकि पायथन केवल व्हाइट-स्पेस का उपयोग करता है। रूबी में हाल ही में व्हाट्सएप केवल इंडेंटेशन के लिए अनुमति देने के प्रयास किए गए हैं http://github.com/michaeledgar/seamless


2
एकाधिक वंशानुक्रम के संबंध में, यह कहना कि "रूबी नहीं करता है" अपमानजनक है। मैं कई चीज़ों के बारे में नहीं सोच सकता जो आप कई विरासतों के साथ पायथन में कर सकते हैं जो आप मॉड्यूल / "मिक्सिन इनहेरिटेंस" के साथ रूबी में नहीं कर सकते। (यह भी तर्कपूर्ण है कि मॉड्यूल सहित सादा एक से अधिक वंशानुक्रम है।)
लोगान कैपल्डो

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

3
मॉड्यूल वर्ग नहीं हैं, लेकिन कक्षा मॉड्यूल हैं। % रूबी -ई 'पी क्लास <मॉड्यूल' सच है
लोगान कैपल्डो

8
-1, दुर्भाग्य से, यह प्रश्न अपने लक्ष्य को याद करता है और अधिकांश कथित अंतर सभी और गलत सूचनाओं के बीच अंतर नहीं हैं!
पक्षपात

2
मॉड्यूल में वास्तव में कई विरासत शामिल हैं, न केवल अवधारणा में बल्कि रूबी दुभाषिया में वास्तविक कार्यान्वयन में। जब एक रूबी मॉड्यूल शामिल होता है, तो इसे विरासत श्रृंखला में अंतःक्षिप्त किया जाता है ठीक उसी तरह जैसे कि सुपरक्लास हैं। विधि संकल्प समान है। रूबी में कई मॉड्यूल शामिल हैं कई विरासत हैं। जो कोई भी इसे शब्दार्थ "एक ही बात नहीं" के रूप में एकाधिक वंशानुक्रम के रूप में लड़ना चाहता है, वह सिर्फ पांडित्य है। यदि प्रभाव समान और सरलता से प्राप्त किया जाता है, तो "समान चीज़" के न होने का क्या मतलब है? बिना भेद का एक भेद।
डेव सिम्स

जवाबों:


34

रूबी के पास ब्लॉकों की अवधारणाएं हैं , जो अनिवार्य रूप से कोड के एक खंड के आसपास सिंटैक्टिक चीनी हैं; वे क्लोजर बनाने और उन्हें दूसरे तरीके से पास करने का एक तरीका है जो ब्लॉक का उपयोग कर सकता है या नहीं भी कर सकता है। एक yieldबयान के माध्यम से बाद में एक ब्लॉक का आह्वान किया जा सकता है ।

उदाहरण के लिए, किसी eachविधि की एक सरल परिभाषा Arrayकुछ इस तरह हो सकती है:

class Array
  def each
    for i in self  
      yield(i)     # If a block has been passed, control will be passed here.
    end  
  end  
end  

तब आप इसे इस तरह से लागू कर सकते हैं:

# Add five to each element.
[1, 2, 3, 4].each{ |e| puts e + 5 }
> [6, 7, 8, 9]

पायथन के अनाम कार्य / क्लोजर / लैम्ब्डा हैं, लेकिन इसमें बहुत से ब्लॉक नहीं हैं क्योंकि यह कुछ उपयोगी सिंटैक्टिक चीनी को याद कर रहा है। हालांकि, एड-हॉक फैशन में इसे पाने का कम से कम एक तरीका है। उदाहरण के लिए, यहाँ देखें ।


6
@ लेन्‍टार्ट: आपके उदाहरण के अलावा सिर्फ भयानक मधुमक्खी के कारण यह कृत्रिम रूप से गलत है।

2
@unbeknow: ए, सही। लेकिन अगर वह प्रिंट के बजाय एक फ़ंक्शन होता, तो यह काम करता। अजगर 3 में यह काम करता है: [1,2,3,4] में ई के लिए [प्रिंट (ई + 5)] और जब यह भयावहता की बात आती है, तो मुझे लगता है कि ऊपर दिया गया रूबी कोड भयानक है, इसलिए यह स्पष्ट रूप से व्यक्तिपरक है और इस प्रकार ए नहीं इस सवाल का हिस्सा। @ मैं यह नहीं कह रहा हूं कि यह बराबर है, मैं कह रहा हूं कि यह स्पष्ट नहीं है कि आपके उदाहरण से क्या अंतर है। @ बास्टियन, नहीं, लेकिन आप इसी तरह की चीजें कर सकते हैं इसका मतलब यह नहीं है कि वे समान हैं। यहां मतभेदों को सूचीबद्ध किया जाना चाहिए, भले ही ऐसा करने के लिए otehr तरीके हों।
लेनार्ट रेगेब्र जूल 11'09

22
मैं पायथन प्रोग्रामर हूं। मैं एक उदाहरण देखना चाहूंगा कि रूबी ब्लॉक आपको पाइथन के साथ तुलना में कुछ अधिक स्पष्ट रूप से या अधिक सुंदर लिखने में मदद करता है क्योंकि यह ब्लॉक नहीं है। आपका उदाहरण लिखा जा सकता है: i in [1, 2, 3, 4]: प्रिंट (i + 5) के लिए। यह ब्लॉक का उपयोग नहीं करता है, लेकिन इसका संक्षिप्त और सुंदर और साथ ही माणिक प्रत्येक उदाहरण।
मैनुअल सेरोन

10
@ मैनुअल, गैर-तुच्छ डेटा संरचनाओं (पेड़, रेखांकन ...) के लिए फंक्शंस संलग्न करने के लिए प्रोक्स उपयोगी होते हैं, जो 'फॉर-लूप' नहीं हो सकते हैं और इसलिए ट्रांसवर्स के लिए विशेष पुनरावृत्तियों की आवश्यकता होती है। ब्लॉक, जो गुमनाम प्रॉक्स हैं, आपको एक अभिव्यक्ति (बनाम परिभाषित लागू करें) में फ़नकार को लागू करने देता है जो नाटकीय रूप से कोडिंग की प्रक्रिया को गति देता है और इरादे को स्पष्ट करता है। उदाहरण के लिए, यदि आप एक ग्राफ़ डेटा संरचना बना रहे हैं, तो आप एक 'प्रत्येक' इटरेटर को परिभाषित कर सकते हैं और फिर एमीनेरेबल को मिला सकते हैं, जो आपको तुरंत दर्जनों पुनरावृत्तियों (जैसे, सभी ?, जीआरईपी) तक पहुंच प्रदान करेगा। अब आप एक ब्लॉक कहते हैं ...
पूर्वाग्रह

4
@RommeDeSerieux, क्योंकि इसे भाषा में नाम की आवश्यकता है! इसके अलावा, यह एक फ़ंक्शन ऑब्जेक्ट है, फ़ंक्शन नहीं है। आइए रूबी डॉक्स को देखें: "प्रोक ऑब्जेक्ट कोड के ब्लॉक हैं जो स्थानीय चर के एक सेट से बंधे हुए हैं" इसलिए एक गुमनाम प्रोक सिर्फ ब्लॉक है और यह निश्चित रूप से केवल एक फ़ंक्शन नहीं है!
पूर्वाग्रह

28

पायथन उदाहरण

पायथन में फ़ंक्शंस प्रथम श्रेणी के चर हैं। आप एक फ़ंक्शन की घोषणा कर सकते हैं, इसे ऑब्जेक्ट के रूप में पास कर सकते हैं, और इसे अधिलेखित कर सकते हैं:

def func(): print "hello"
def another_func(f): f()
another_func(func)

def func2(): print "goodbye"
func = func2

यह आधुनिक स्क्रिप्टिंग भाषाओं की एक मौलिक विशेषता है। जावास्क्रिप्ट और लुआ भी ऐसा करते हैं। रूबी इस तरह से कार्यों का इलाज नहीं करता है; किसी फ़ंक्शन का नामकरण इसे कॉल करता है।

बेशक, रूबी में इन चीजों को करने के तरीके हैं, लेकिन वे प्रथम श्रेणी के ऑपरेशन नहीं हैं। उदाहरण के लिए, आप इसे एक चर के रूप में मानने के लिए Proc.new के साथ एक फ़ंक्शन को लपेट सकते हैं - लेकिन फिर यह एक फ़ंक्शन नहीं है; यह एक "कॉल" विधि के साथ एक वस्तु है।

रूबी के कार्य प्रथम श्रेणी की वस्तुएं नहीं हैं

रूबी फ़ंक्शन प्रथम श्रेणी की वस्तुएँ नहीं हैं। उन्हें चारों ओर से गुजरने के लिए एक वस्तु में लपेटा जाना चाहिए; परिणामी वस्तु को एक फ़ंक्शन की तरह नहीं माना जा सकता है। प्रथम श्रेणी में कार्य सौंपे नहीं जा सकते हैं; इसके बजाय, उसके कंटेनर ऑब्जेक्ट में एक फ़ंक्शन को उन्हें संशोधित करने के लिए बुलाया जाना चाहिए।

def func; p "Hello" end
def another_func(f); method(f)[] end
another_func(:func)      # => "Hello"

def func2; print "Goodbye!"
self.class.send(:define_method, :func, method(:func2))
func                     # => "Goodbye!"

method(:func).owner      # => Object
func                     # => "Goodbye!"
self.func                # => "Goodbye!"    

8
तुम बुरी तरह से भ्रमित हो। प्रथम श्रेणी की वस्तुओं को असाइनमेंट द्वारा सौंपा गया है: x = yकॉल करके नहीं self.class.send(:define_method, :func, method(:func2))। आपका "प्रतिपक्ष" यह दिखाता है कि रूबी के कार्य प्रथम श्रेणी के नहीं हैं। यदि आप असहमत हैं, तो बेझिझक अपना जवाब दें; अपने भ्रम को मेरा मत बनाइए।
ग्लेन मेयार्ड

7
def ... endमाणिक द्वारा परिभाषित चीजें कार्य नहीं हैं। वे तरीके हैं (जिस तरह से आपने उन्हें परिभाषित किया है Kernel)। तरीके अनबाउंड ( #methodविधि का उपयोग करके ) हो सकते हैं, जो तब ऑब्जेक्ट हैं। निकटतम कार्य रूबी के Procउदाहरण हैं, जो कि वस्तुएं भी हैं, और इन्हें पास किया जा सकता है या इनवॉइस किया जा सकता है। यह एक एकल कॉलबैक Procको एक विधि में पारित करने के लिए एक विशेष वाक्यविन्यास भी है , जैसा कि जॉन फेमिनाला अपने जवाब में चर्चा करता है
रैंपियन

4
@ ग्लेन: मुझे वही मिल रहा है जो आप कह रहे हैं, लेकिन मैं इस बात से सहमत होना चाहता हूं कि रूबी के पुनर्परिभाषित कार्य - विधियाँ एक अलग अर्थ अवधारणा हैं। यदि आप परिभाषा का खेल खेलना चाहते हैं, तो अधिकांश अनिवार्यता प्रक्रिया है, कार्य नहीं। मैं मुश्किल होने की कोशिश नहीं कर रहा हूं, यह सिर्फ इतना है कि मेरा मानना ​​है कि परिभाषाएं और सटीकता महत्वपूर्ण हैं। मैं मानता हूँ कि एक हेरफेर UnboundMethodएक PITA, यद्यपि हो सकता है।
प्राचीर

5
@ ग्लेन: सौंदर्य देखने वाले की आंखों में है। बहरहाल, परिभाषा को पूरा करने के लिए विधियाँ प्रथम श्रेणी की वस्तुएँ हैं (इस मामले में मैं विकिपीडिया परिभाषा की बात कर रहा हूँ)। हो सकता है, आपके पास प्रथम श्रेणी की कुछ अन्य परिभाषा हो? क्या उन्हें प्रथम श्रेणी में आने के लिए प्लेटिनम फ़्रीक्वेंट फ़्लियर कार्ड की आवश्यकता है?
पूर्वाग्रह

4
@ Genn SO SO FAQ अनुभाग देखें "अन्य लोग मेरे सामान को संपादित कर सकते हैं?" - यह एक कम्युनिटी विकी है।
पूर्वाग्रह

26

अंतत: सभी उत्तर किसी न किसी स्तर पर व्यक्तिपरक होने जा रहे हैं, और अब तक पोस्ट किए गए उत्तर बहुत साबित करते हैं कि आप किसी भी एक विशेषता को इंगित नहीं कर सकते हैं जो अन्य भाषा में समान रूप से अच्छा नहीं है (यदि समान नहीं है) , क्योंकि दोनों भाषाएँ बहुत संक्षिप्त और अभिव्यंजक हैं।

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

इस स्ट्रिंग में शब्दों को उल्टा करें:

sentence = "backwards is sentence This"

जब आप सोचते हैं कि आप इसे कैसे करेंगे, तो आप निम्न कार्य करेंगे:

  1. वाक्य को शब्दों में विभाजित करें
  2. शब्दों को उलट दें
  3. शब्दों को पुनः एक स्ट्रिंग में शामिल करें

रूबी में, आप ऐसा करेंगे:

sentence.split.reverse.join ' '

बिल्कुल जैसा कि आप इसके बारे में सोचते हैं, उसी क्रम में, एक विधि एक के बाद एक कॉल करती है।

अजगर में, यह इस तरह दिखाई देगा:

" ".join(reversed(sentence.split()))

यह समझना मुश्किल नहीं है, लेकिन इसमें समान प्रवाह नहीं है। विषय (वाक्य) को बीच में दफनाया जाता है। संचालन कार्यों और वस्तु विधियों का मिश्रण हैं। यह एक तुच्छ उदाहरण है, लेकिन एक कई अलग-अलग उदाहरणों को पता चलता है जब वास्तव में रूबी के साथ काम करना और समझना, विशेष रूप से गैर-तुच्छ कार्यों पर।


1
मैं सहमत हूँ। जब मैं इसे लिखता हूं तो रूबी स्वाभाविक रूप से प्रवाहित होती है, इसलिए "ज़ेनइल" एक अच्छा शब्द है।
टीन मैन

18

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

उदाहरण के लिए, रूबी:

>> PI = 3.14
=> 3.14
>> PI += 1
(irb):2: warning: already initialized constant PI
=> 4.14

अजगर:

>>> PI = 3.14
>>> PI += 1
>>> PI
4.1400000000000006

19
हा .. यह मुझे याद दिलाता है कि कम से कम अजगर 2 में। *, आप "सही, गलत = गलत, सच्चा" करने में सक्षम थे ... मेरा मानना ​​है कि उन्होंने सही तरीके से तय किया है कि अजगर 3.0 ... यह कुछ ऐसा है जो आपको करना चाहिए। करने से रोका जा सकता है।
टॉम

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

8
@ बियास - मुझे यकीन नहीं है कि आप मुझे नीचा दिखा रहे हैं। यह जवाब चीजों को करने के अजगर के तरीके से सहमत या असहमत नहीं है। यह सिर्फ एक बयान है।
जेसन बेकर

13
@ जैसन "हम सभी वयस्क यहाँ हैं" एक तथ्य का एक बयान है? मैं कॉल करना चाहूंगा कि एक राय एक विशेषता के आसपास लिपटे, इसलिए नीचे वोट।
पूर्वाग्रह

7
@ बियास - यह कहते हुए कि "हम सभी वयस्क यहाँ हैं" मामूली के रूप में नहीं था। यह एक अनौपचारिक पायथन आदर्श वाक्य है, जो मेरा मानना ​​है कि यहां सबसे अच्छा समझाया गया है: mail.python.org/pipermail/tutor/2003-October/025932.html
इवान पोर्टर

18

आप पायथन में एक मॉड्यूल से केवल विशिष्ट कार्य आयात कर सकते हैं। रूबी में, आप तरीकों की पूरी सूची आयात करते हैं। आप उन्हें रूबी में "महत्वहीन" कर सकते हैं, लेकिन यह ऐसा नहीं है जो इसके बारे में है।

संपादित करें:

आइए इस रूबी मॉड्यूल को लेते हैं:


module Whatever
  def method1
  end

  def method2
  end
end

यदि आप इसे अपने कोड में शामिल करते हैं:


include Whatever

आप देखेंगे कि method1 और method2 दोनों को आपके नामस्थान में जोड़ दिया गया है। आप केवल method1 को आयात नहीं कर सकते । आप या तो उन दोनों को आयात करते हैं या आप उन्हें बिल्कुल भी आयात नहीं करते हैं। पायथन में आप अपने चयन के तरीकों को ही आयात कर सकते हैं। यदि यह एक नाम होता तो शायद इसे चयनात्मक आयात कहा जाता?


2
अरे हाँ! पायथन को नेमस्पेस पसंद है। क्या रूबी में ऐसा नहीं है? आप import bla; bla.foo()रूबी में नहीं है?
लेनार्ट रेगेब्र जूल

2
आप केवल फंक्शन आयात कर सकते हैं, न कि सभी फंक्शंस अंदर। यदि उदाहरण के लिए आप एक रूबी मॉड्यूल शामिल करते हैं जो 3 गैर-स्थिर कार्यों की घोषणा करता है, तो आप उन्हें अपने नाम स्थान में शामिल करते हैं। अजगर में आपको मॉड्यूल आयात * से लिखना होगा।
जियो

6
यह नामस्थान अव्यवस्था का एक बहुत करने के लिए नेतृत्व नहीं करता है?
लेन्नर्ट रेगेब्र जूल 11'09

1
मुझे लगता है कि यह करता है। मुझे रूबी मॉड्यूल के बारे में नफरत है।
जियो

8
रूबी के पास वास्तव में अजगर के समान एक मॉड्यूल सिस्टम नहीं है। मूल रूप से द्वैध समावेश के लिए कुछ चेक के साथ पाठीय समावेश के रूप में मूल रूप से काम करने की आवश्यकता होती है। आप नाम स्थान के रूप में मॉड्यूल का उपयोग कर सकते हैं (एब) moduleवास्तव में एक मिथ्या नाम का एक सा है। मॉड्यूल मूल रूप से कक्षाएं हैं new, allocateविधियां हैं। वे प्रति वर्ग / वस्तु के आधार पर कोड साझा करने के तरीके के रूप में सबसे अच्छा काम करते हैं, पुस्तकालयों के विभाजन के लिए तंत्र के रूप में नहीं, या कार्यक्रमों में कोड साझा करने के लिए।
लोगान कैपेल्डो जूल 12'09

16

रूबी की वेबसाइट से :

रूबी में पायथन के साथ समानताएं, ...

  • एक संवादात्मक संकेत है (जिसे irb कहा जाता है)।
  • आप कमांड लाइन (pydoc के बजाय री कमांड के साथ) पर डॉक्स पढ़ सकते हैं।
  • कोई विशेष लाइन टर्मिनेटर नहीं हैं (सामान्य न्यूलाइन को छोड़कर)।
  • स्ट्रिंग शाब्दिक पायथन की ट्रिपल-उद्धृत स्ट्रिंग्स जैसी कई पंक्तियों को फैला सकते हैं।
  • ब्रैकेट सूचियों के लिए होते हैं, और ब्रेसिज़ डिकट्स के लिए होते हैं (जो, रूबी में, "हैश" कहलाते हैं)।
  • Arrays समान काम करते हैं (उन्हें जोड़ने से एक लंबी सरणी बनती है, लेकिन उन्हें इस तरह से तैयार करना a3 = [ a1, a2 ]आपको सरणी का एक सरणी देता है)।
  • वस्तुओं को दृढ़ता से और गतिशील रूप से टाइप किया जाता है।
  • सब कुछ एक वस्तु है, और चर सिर्फ वस्तुओं के संदर्भ हैं।
  • हालाँकि खोजशब्द थोड़े भिन्न हैं, अपवाद उसी के बारे में काम करते हैं।
  • आपको एम्बेड किए गए डॉक्टर उपकरण मिले हैं (रूबी को rdoc कहा जाता है)।

रूबी में पायथन के विपरीत अंतर ...

  • तार परस्पर जुड़े हुए हैं।
  • आप स्थिरांक बना सकते हैं (चर जिनके मूल्य आप बदलने का इरादा नहीं रखते हैं)।
  • कुछ लागू किए गए केस-कन्वेंशन हैं (पूर्व श्रेणी के नाम बड़े अक्षर से शुरू होते हैं, चर लोअरकेस अक्षर से शुरू होते हैं)।
  • सूची कंटेनर (एक सरणी) का केवल एक प्रकार है, और यह परिवर्तनशील है।
  • डबल-उद्धृत स्ट्रिंग्स एस्केप सीक्वेंस (जैसे \ t) और एक विशेष "एक्सप्रेशन प्रतिस्थापन" सिंटैक्स की अनुमति देते हैं (जो आपको रूबी एक्सप्रेशन के परिणामों को सीधे "स्ट्रिंग्स" + "+" एक साथ "जोड़कर" बिना अन्य स्ट्रिंग्स में सम्मिलित करने की अनुमति देता है) । एकल-उद्धृत स्ट्रिंग्स पायथन के आर "कच्चे तार" की तरह हैं।
  • कोई "नई शैली" और "पुरानी शैली" कक्षाएं नहीं हैं। बस एक तरह का।
  • आप कभी भी सीधे एसेसरीज़ एक्सेस नहीं करते हैं। रूबी के साथ, यह सब विधि कॉल है।
  • विधि कॉल के लिए कोष्ठक आमतौर पर वैकल्पिक होते हैं।
  • पाइथन के बजाय सार्वजनिक, निजी और पहुंच को लागू करने के लिए संरक्षित है _voluntary_ underscore __convention__
  • मल्टीपल इनहेरिटेंस के बजाय "मिक्सिन" का उपयोग किया जाता है।
  • आप अंतर्निहित कक्षाओं के तरीकों को जोड़ या संशोधित कर सकते हैं। दोनों भाषाएं आपको किसी भी बिंदु पर कक्षाएं खोलने और संशोधित करने देती हैं, लेकिन पायथन अंतर्निहित इंसर्ट के संशोधन को रोकता है - रूबी नहीं करता है।
  • आप ट्रू और फाल्स (और नील के बजाय नील) के बजाय सच्चे और झूठे हो गए हैं।
  • जब सत्य के लिए परीक्षण किया जाता है, तो केवल झूठे और शून्य एक झूठे मूल्य का मूल्यांकन करते हैं। बाकी सब कुछ सच है (0, 0.0, "", और [] सहित)।
  • यह एलिफ के बजाय एल्सिफ है।
  • इसके बजाय आयात की आवश्यकता है। अन्यथा, हालांकि, उपयोग समान है।
  • डॉक्स को जेनरेट करने के लिए चीजों के ऊपर की रेखाओं पर सामान्य शैली की टिप्पणी (उनके नीचे डॉकस्ट्रिंग्स के बजाय) का उपयोग किया जाता है।
  • ऐसे कई शॉर्टकट हैं, जो आपको याद रखने के लिए और अधिक देते हैं, आप जल्दी सीख जाते हैं। वे रूबी को मज़ेदार और बहुत उत्पादक बनाते हैं।

2
"इसके बजाय आयात की आवश्यकता है। अन्यथा, हालांकि, उपयोग समान है।" पूरी तरह से गलत होने लगता है।
ग्लेनजामिन

रूबी में सेट्स भी हैं जो लोग शायद ही कभी उपयोग करते हैं, लेकिन वे अंदर निर्मित होते हैं। इसलिए मैं कह सकता हूं, stuff_in_backpack = Set.new; stuff_in_backpack << "कंप्यूटर"; stuff_in_backpack << "जूते"; # और सेट आदेश की गारंटी के बिना सभी मूल्यों को धारण करेगा।
zachaysan

12

रूबी के पास पाइथन से अधिक क्या है इसकी स्क्रिप्टिंग भाषा क्षमताएं हैं। इस संदर्भ में स्क्रिप्टिंग भाषा का अर्थ शेल स्क्रिप्ट और सामान्य पाठ हेरफेर में "गोंद कोड" के लिए उपयोग किया जाना है।

इन्हें ज्यादातर पर्ल के साथ साझा किया जाता है। प्रथम श्रेणी में निर्मित नियमित अभिव्यक्तियाँ, $ -यारीबल, उपयोगी कमांड लाइन विकल्प जैसे पर्ल (-ए, -ई) आदि।

साथ में इसकी कविता अभी तक epxressive सिंटैक्स के साथ यह इस तरह के कार्यों के लिए एकदम सही है।

मेरे लिए पायथन एक गतिशील रूप से टाइप की गई व्यावसायिक भाषा है जो सीखने में बहुत आसान है और इसमें एक साफ वाक्यविन्यास है। रूबी के रूप में "शांत" नहीं बल्कि साफ-सुथरा। पाइथन ने रूबी को मेरे ऊपर जो कुछ दिया है वह अन्य कामों के लिए बाँधने की विशाल संख्या है। क्यूटी और अन्य जीयूआई के कामों के लिए बाइंडिंग, कई गेम समर्थन पुस्तकालयों और और। रूबी बहुत कम है। जबकि डेटाबेस के लिए बहुत अधिक उपयोग किए जाने वाले बाइंडिंग उदाहरण अच्छी गुणवत्ता के हैं, मुझे लगता है कि पाइथन में बेहतर सहायक होने के लिए भले ही उसी पुस्तकालय में एक रूबी बंधन भी हो।

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


1
किसी ऐसे व्यक्ति से प्रश्न जो अभी तक रूबी को नहीं जानता है: "$ -वरिएबल्स" से आपका क्या मतलब है? क्या आप वैश्विक चर का मतलब है? यदि ऐसा है, तो पायथन में, एक वर्ग या फ़ंक्शन के बाहर एक मॉड्यूल में परिभाषित एक चर वैश्विक है। यदि नहीं - क्या अंतर है?
आयन

1
Anon: यदि आप कोड में कहीं भी $ चर घोषित करते हैं तो यह उपसर्ग के कारण वैश्विक है। इस प्रकार, यह कोई फर्क नहीं पड़ता कि यह कहाँ परिभाषित है यह हमेशा वैश्विक है, और हमेशा इस तरह के रूप में जाना जाता है।
राबर्ट के

8
बिल्कुल नहीं, वास्तव में मेरा मतलब पूर्व-परिभाषित चर जैसे $ _, $ 1 आदि थे। ये स्वतः ही रूबी द्वारा मूल्यों से भरे होते हैं। $ _ अंतिम पंक्ति पढ़ी गई है। $ 1, $ 2, आदि पिछले मैच से नियमित अभिव्यक्ति मैच हैं। पूरी सूची के लिए यहां देखें: zenspider.com/Languages/Ruby/QuickRef.html#17 यह मूल रूप से कॉम्पैक्ट स्क्रिप्ट के लिए एक हैक है। आप एपीआई कॉल के माध्यम से भी सभी जानकारी प्राप्त कर सकते हैं, लेकिन $ चर का उपयोग करके यह अधिक प्रचलित है। इस तरह के चर सिर्फ पायथन की शैली के अनुरूप नहीं हैं, उन्होंने जानबूझकर उन्हें छोड़ दिया।
हैफैक्स

उस zenspider लिंक के लिए धन्यवाद - रूबी के लिए एक त्वरित (गैर-ट्यूटोरियल) महसूस के लिए कुछ इस तरह की तलाश में था।
आनन

12

मुझे नहीं लगता कि "रूबी के पास एक्स और पायथन है, जबकि पायथन के पास वाई और रूबी नहीं है" यह देखने का सबसे उपयोगी तरीका है। वे काफी समान भाषाएं हैं, जिनमें कई साझा क्षमताएं हैं।

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


5
मैं मानता हूं कि लंबोदर का दायरा सीमित है और कई मामलों में उपयोगी नहीं है। हालाँकि, मुझे नहीं लगता कि यह कहना उचित है कि पायथन प्रोग्रामर प्लेग की तरह उनसे बचते हैं।
जेसन बेकर

1
मैं मानता हूँ कि लंबोदर का उपयोग अक्सर पायथन के साथ किया जाता है - जैसे मानचित्र, फ़िल्टर, कम करना। बड़ा अंतर यह लगता है कि पायथन लैम्ब्डा अभिव्यक्ति तक सीमित हैं, जबकि रूबी ब्लॉक बहुस्तरीय हो सकते हैं और बयान शामिल कर सकते हैं। रूबी के बारे में मैंने जो पढ़ा है, उससे मेरी सामान्य धारणा यह है कि यह सुविधा विशेष रूप से रूबीवादियों को डीएसएल दृष्टिकोण के लिए जाती है, जबकि पाइथोनिस्टा के एपीआई के निर्माण के लिए जाने की अधिक संभावना है। रूबी के बारे में मेरी जानकारी अभी भी बहुत सतही है।
एनॉन

2
@ लेन्आर्ट: रूबी में हर समय मल्टीलाइन ब्लॉकों का उपयोग किया जाता है - अधिक बार जब मैं मुहावरेदार पायथन कोड में इस्तेमाल किए गए लैम्बडा को देखता हूं, वास्तव में। एक सामान्य उदाहरण के लिए, info.michael-simons.eu/2007/08/06/rails-respond_to-bethethod देखें ।
चक

1
@ लाइट: नहीं, यह उपज का उपयोग नहीं करता है। (रूबी की पैदावार अजगर के वैसे भी पूरी तरह से अलग है - यह एक जनरेटर नहीं लौटाता है।) यह लिखना सार्थक नहीं होगा for format in respond_to()respond_toविधि कुछ भी सार्थक वापस नहीं करता है - यह केवल वर्तमान HTTP अनुरोध का जवाब। doमें respond_to doएक ब्लॉक की शुरुआत है। उस ब्लॉक में, हम एक अस्थायी ऑब्जेक्ट ( formatइस उदाहरण में लेबल ) से बात करते हैं जो एक HTTP अनुरोध का जवाब देने के लिए एक बहुत ही बुनियादी DSL को लागू करता है।
चक

3
क्या आप एक जनरेटर के खिलाफ 'मिक्स एन्युमेरेबल' कर सकते हैं और तुरंत 30 नए और अद्भुत पुनरावृत्तियों को प्राप्त कर सकते हैं? ब्लॉक / प्रोक्स महान क्यों हैं, यह समझने से पहले आपको पूरी भाषा में देखना होगा।
पूर्वाग्रह

12

मैं मूल प्रश्न के एक प्रकार का सुझाव देना चाहूंगा, "रूबी के पास ऐसा क्या है जो पायथन नहीं करता है, और इसके विपरीत?" जो निराशाजनक जवाब को स्वीकार करता है, "ठीक है, आप रूबी या पायथन के साथ क्या कर सकते हैं जो इंटरकॉल में नहीं किया जा सकता है?" उस स्तर पर कुछ भी नहीं है, क्योंकि पायथन और रूबी दोनों विशाल शाही परिवार का हिस्सा हैं, जो ट्यूरिंग सन्निकट होने के सिंहासन पर बैठे हैं।

लेकिन इससे क्या:

पाइथन में सुंदर और अच्छी तरह से क्या किया जा सकता है जो रूबी में ऐसी सुंदरता और अच्छी इंजीनियरिंग के साथ नहीं किया जा सकता है, या इसके विपरीत?

यह सुविधा की तुलना में बहुत अधिक दिलचस्प हो सकता है।


सबसे अच्छी टिप्पणी। अभी भी मेरे +1
नवाफाल

11

पायथन में लिस्ट-कॉम्प्रिहेंशन और जनरेटर के लिए एक स्पष्ट, बिल्ट सिंटैक्स है, जबकि रूबी में आप मैप और कोड ब्लॉक का उपयोग करेंगे।

तुलना

list = [ x*x for x in range(1, 10) ]

सेवा

res = (1..10).map{ |x| x*x }

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

लेकिन रूबी में कोई लिस्ट कॉम्प्रिहेंशन सिंटैक्स नहीं है
डारो

पायथन: रेस = मैप (लैम्ब्डा x: x * x, रेंज (1,10))
GogaRieger

अजगर:res=map(2 .__rpow__, range(1,10))
जॉन ला रोय

11

"चर जो एक बड़े अक्षर से शुरू होते हैं, स्थिरांक बन जाते हैं और उन्हें संशोधित नहीं किया जा सकता है"

गलत। वे कर सकते हैं।

यदि आप करते हैं तो आपको केवल एक चेतावनी मिलती है।


2
यदि कोई भाषा आपको किसी ऑपरेशन के लिए चेतावनी देती है, तो यह मेरी राय है कि आप ऑपरेशन को "संभव नहीं" मान सकते हैं। और कुछ भी पागलपन है।
porgarmingduod

11

बुनियादी ढाँचे पर कुछ और:

  • रूबी की तुलना में पायथन का C ++ ( Boost.Python , SIP और Py ++ जैसी चीजों के साथ) के साथ बहुत बेहतर एकीकरण है , जहाँ विकल्प रूबी दुभाषिया एपीआई (जो आप पायथन के साथ भी कर सकते हैं, के खिलाफ सीधे लिखते हैं, निश्चित रूप से) लेकिन ऐसा करने वाले दोनों मामलों में निम्न स्तर, थकाऊ, और त्रुटि प्रवण) या SWIG का उपयोग करें (जो, काम करता है और निश्चित रूप से बहुत अच्छा है यदि आप कई भाषाओं का समर्थन करना चाहते हैं, तो Boost.Python या SIP के रूप में लगभग उतना अच्छा नहीं है यदि आप विशेष रूप से C ++ को बाँध रहे हैं)।

  • पायथन में कई वेब एप्लिकेशन वातावरण (Django, Pylons / Turbogears, web.py, शायद कम से कम आधा दर्जन अन्य) हैं, जबकि रूबी (प्रभावी रूप से) में एक है: रेल। (अन्य रूबी वेब फ्रेमवर्क मौजूद हैं, लेकिन प्रतीत होता है कि मुश्किल समय में रेल के खिलाफ बहुत अधिक कर्षण हो सकता है)। यह पहलू अच्छा है या बुरा? कहना मुश्किल है, और शायद काफी व्यक्तिपरक; मैं आसानी से तर्कों की कल्पना कर सकता हूं कि पायथन की स्थिति बेहतर है और रूबी की स्थिति बेहतर है।

  • सांस्कृतिक रूप से, पायथन और रूबी समुदाय कुछ अलग प्रतीत होते हैं, लेकिन मैं केवल इस पर संकेत कर सकता हूं क्योंकि मेरे पास रूबी समुदाय के साथ बातचीत करने का इतना अनुभव नहीं है। मैं इसे ज्यादातर इस उम्मीद में शामिल कर रहा हूं कि जिस व्यक्ति के पास दोनों के साथ बहुत अधिक अनुभव है, वह इस कथन को बढ़ा (या अस्वीकार) कर सकता है।


7
आपका दूसरा बिंदु सबसे गलत सूचना पर है। आपको रैक और सिनात्रा को देखना शुरू करना चाहिए
मैक्स ओग्डेन

6
मैं स्पष्ट रूप से ध्यान देता हूं कि अन्य रेल स्टैक मौजूद हैं; मुझे नहीं लगता कि कोई भी वास्तव में उनका उपयोग कर रहा है। सिनात्रा और रैक की जाँच ने उस धारणा को बिल्कुल नहीं बदला। क्या आप वास्तव में सोचते हैं, कहते हैं, सिनात्रा (94 एसओ कुल प्रश्न), या कैम्पिंग (2 एसओ कुल प्रश्न), या किसी भी अन्य, वास्तव में एक वास्तविक उपयोगकर्ता / समुदाय है? उनमें से अधिकांश के पास वास्तविक जीवन उपयोगकर्ता भी नहीं हैं, जहां तक ​​मैं बता सकता हूं। उस मामले के लिए Django (4K +) या रेल (7K +), या यहां तक ​​कि web.py के साथ तुलना करें।
जैक लॉयड

1
सिनात्रा वास्तव में अपने DSL के कारण अलग, हल्के कार्यों के लिए लोकप्रिय है। इसका कम इस्तेमाल होता है क्योंकि रेल का MVC अधिक प्रदान करता है। रेल वास्तव में रैक पर बनाई गई है - जो कि फ्यूजन पैसेंजर को संभव बनाती है।
वैकल्पिक

11

बेशर्म कॉपी / से चिपकाया: एलेक्स मार्टेली पर जवाब " क्या रूबी अजगर से के बारे में बेहतर है " से धागा comp.lang.python मेलिंग सूची।

अगस्त 18 2003, 10:50 पूर्वाह्न एरिक मैक्स फ्रांसिस ने लिखा:

"ब्रैंडन जे। वान हर" ने लिखा है:

रूबी के बारे में पायथन से बेहतर क्या है? मुझे यकीन है कि कुछ है। यह क्या है?

क्या पाइथन लोगों के बजाय रूबी लोगों से यह पूछना ज्यादा अच्छा नहीं होगा?

किसी के उद्देश्यों पर निर्भर हो सकता है या नहीं भी हो सकता है - उदाहरण के लिए, यदि किसी के उद्देश्यों में पायथन समुदाय का "समाजशास्त्रीय अध्ययन" शामिल है, तो उस समुदाय पर सवाल डालने से इसके बारे में और अधिक जानकारी प्राप्त होने की संभावना है, उन्हें कहीं और लगाने से। :-)।

व्यक्तिगत रूप से, मैंने पिछले OSCON में डेव थॉमस के एक दिवसीय रूबी ट्यूटोरियल का अनुसरण करने का अवसर दिया। सिंटैक्स मतभेदों की एक पतली लिबास के नीचे, मुझे रूबी और पायथन आश्चर्यजनक रूप से समान लगते हैं - अगर मैं भाषाओं के किसी भी सेट के बीच न्यूनतम फैले हुए पेड़ की गणना कर रहा था, तो मुझे पूरा यकीन है कि पायथन और रूबी पहले दो पत्तों को समेटना होगा एक मध्यवर्ती नोड :-)

निश्चित रूप से, मैं थके हुए हो जाता हूं, रूबी में, प्रत्येक ब्लॉक के अंत में मूर्खतापूर्ण "अंत" टाइप करने के बजाय (केवल अनुत्तरदायी) - लेकिन फिर मुझे समान रूप से मूर्खतापूर्ण टाइपिंग से बचने के लिए मिलता है ':' जिसे पायथन की आवश्यकता है प्रत्येक ब्लॉक की शुरुआत , ताकि लगभग धुलाई :-)। अन्य वाक्यविन्यास अंतर जैसे '@foo' बनाम 'self.foo', या रूबी बनाम पायथन में मामले का उच्च महत्व, वास्तव में मेरे लिए अप्रासंगिक हैं।

दूसरों को कोई संदेह नहीं है, बस ऐसे मुद्दों पर प्रोग्रामिंग भाषाओं की उनकी पसंद का आधार है, और वे सबसे गर्म बहस पैदा करते हैं - लेकिन मेरे लिए यह केवल पार्किंसंस कानूनों में से एक का एक उदाहरण है (कार्रवाई पर बहस की राशि मुद्दे के विपरीत आनुपातिक है वास्तविक महत्व)।

संपादित करें (पूर्वाह्न 6/19/2010 11:45 तक): इसे "बिकेशेड पेंटिंग" के रूप में भी जाना जाता है (या, संक्षेप में, "बाइकेशिंग") - संदर्भ नॉर्थकॉट पार्किंसन के लिए फिर से है, जिन्होंने "बहस" की। किस रंग पर बिकेश को "तुच्छ विषयों पर गर्म बहस" के एक विशिष्ट उदाहरण के रूप में चित्रित किया गया है। (अंत के संपादित करें)।

एक वाक्यविन्यास अंतर जो मुझे महत्वपूर्ण लगता है, और पायथन के पक्ष में - लेकिन अन्य लोगों को कोई संदेह नहीं होगा कि बस उल्टा लगता है - "आप एक फ़ंक्शन को कैसे कहते हैं जो कोई पैरामीटर नहीं लेता है"। पायथन में (सी की तरह), एक फ़ंक्शन को कॉल करने के लिए आप हमेशा "कॉल ऑपरेटर" को लागू करते हैं - आप जिस वस्तु को कॉल कर रहे हैं उसके ठीक बाद कोष्ठक को पीछे छोड़ते हुए (उन अनुगामी कोष्ठकों के अंदर आप जिस कॉल में पास हो रहे हैं, उस पर जाएं - यदि आप कोई आर्ग नहीं कर रहे हैं, फिर कोष्ठक खाली हैं)। यह किसी भी का मात्र उल्लेख छोड़ देता है ऑब्जेक्ट, जिसमें कोई ऑपरेटर शामिल नहीं है, जिसका अर्थ है ऑब्जेक्ट का केवल एक संदर्भ - किसी भी संदर्भ में, विशेष मामलों, अपवादों, तदर्थ नियमों और इस तरह के बिना। रूबी में (पास्कल में), तर्कों के साथ एक फ़ंक्शन को कॉल करने के लिए, आप आर्ग्स पास करते हैं (आमतौर पर कोष्ठक में, हालांकि यह हमेशा मामला नहीं होता है) - लेकिन अगर फ़ंक्शन कोई आर्ग नहीं लेता है, तो फ़ंक्शन का उल्लेख करने के लिए इसे सीधे कॉल करें। यह कई लोगों की अपेक्षाओं को पूरा कर सकता है (कम से कम, कोई संदेह नहीं है, जिनके प्रोग्रामिंग का एकमात्र पिछला अनुभव पास्कल के साथ था, या अन्य भाषाओं में समान "निहित कॉलिंग", जैसे विज़ुअल बेसिक) - लेकिन मेरे लिए, इसका मतलब है किसी वस्तु का उल्लेख केवल EITHER का अर्थ वस्तु के संदर्भ में हो सकता है, या वस्तु के प्रकार के आधार पर वस्तु को कॉल - और उन मामलों में जहां मैं कर सकता हूं ' टी वस्तु का एक संदर्भ प्राप्त करें केवल इसका उल्लेख करके मुझे स्पष्ट रूप से उपयोग करने की आवश्यकता होगी "मुझे इसका संदर्भ दें, इसे कॉल न करें!" ऑपरेटरों कि अन्यथा की जरूरत नहीं है। मुझे लगता है कि यह कार्यों (या विधियों, या अन्य कॉल करने योग्य वस्तुओं) की "प्रथम-श्रेणीता" और सुचारू रूप से वस्तुओं के परस्पर जुड़ने की संभावना को प्रभावित करता है। इसलिए, मेरे लिए, यह विशिष्ट वाक्यविन्यास अंतर रूबी के खिलाफ एक गंभीर काला निशान है - लेकिन मुझे समझ में नहीं आता कि अन्य लोग क्यों अन्यथा बात करेंगे, भले ही मैं शायद ही उनके साथ और अधिक असहमत हो सकता हूं :-)। फ़ंक्शंस (या तरीके, या अन्य कॉल करने योग्य ऑब्जेक्ट) और ऑब्जेक्ट्स को सुचारू रूप से इंटरचेंज करने की संभावना। इसलिए, मेरे लिए, यह विशिष्ट वाक्यविन्यास अंतर रूबी के खिलाफ एक गंभीर काला निशान है - लेकिन मुझे समझ में नहीं आता कि अन्य लोग क्यों अन्यथा बात करेंगे, भले ही मैं शायद ही उनके साथ और अधिक असहमत हो सकता हूं :-)। फ़ंक्शंस (या तरीके, या अन्य कॉल करने योग्य ऑब्जेक्ट) और ऑब्जेक्ट्स को सुचारू रूप से इंटरचेंज करने की संभावना। इसलिए, मेरे लिए, यह विशिष्ट वाक्यविन्यास अंतर रूबी के खिलाफ एक गंभीर काला निशान है - लेकिन मुझे समझ में नहीं आता कि अन्य लोग क्यों अन्यथा बात करेंगे, भले ही मैं शायद ही उनके साथ और अधिक असहमत हो सकता हूं :-)।

सिंटैक्स के नीचे, हमें प्रारंभिक शब्दार्थ में कुछ महत्वपूर्ण अंतर मिलते हैं - उदाहरण के लिए, रूबी में तार परस्पर परिवर्तनशील वस्तुएं हैं (जैसे C ++), जबकि पायथन में वे उत्परिवर्तनीय नहीं हैं (जैसे जावा, या मुझे विश्वास है कि C #)। फिर से, जो लोग मुख्य रूप से जो पहले से ही परिचित हैं, वे सोच सकते हैं कि यह रूबी के लिए एक प्लस है (जब तक कि वे जावा या सी # से परिचित नहीं हैं, निश्चित रूप से :-)। मुझे, मुझे लगता है कि अपरिवर्तनीय तार एक उत्कृष्ट विचार है (और मुझे आश्चर्य नहीं है कि जावा, स्वतंत्र रूप से मुझे लगता है, उस विचार को फिर से बहाल कर दिया है जो पहले से ही पायथन में था), हालांकि मुझे "म्यूटेबल स्ट्रिंग बफर" प्रकार के रूप में भी बुरा नहीं लगेगा (और आदर्श रूप से जावा के अपने "स्ट्रिंग बफ़र्स" की तुलना में बेहतर आसानी से उपयोग के साथ एक); और मैं यह निर्णय परिचितता के कारण नहीं देता - जावा का अध्ययन करने से पहले, सभी डेटा अपरिवर्तनीय हैं, मुझे पता था कि सभी भाषाओं में परिवर्तनशील तार थे - फिर भी जब मैंने पहली बार जावा में अपरिवर्तनीय-स्ट्रिंग विचार देखा था (जिसे मैंने पायथन सीखने से पहले अच्छी तरह से सीखा था), इसने मुझे तुरंत उत्कृष्ट के रूप में मारा, एक बहुत अच्छा फिट एक उच्च स्तरीय प्रोग्रामिंग भाषा का संदर्भ-शब्दार्थ (मूल्य-शब्दार्थ के विपरीत जो मशीन के करीब की भाषाओं के साथ सबसे अच्छी तरह से फिट होता है और अनुप्रयोगों से दूर होता है, जैसे C) एक प्रथम श्रेणी के रूप में स्ट्रिंग्स के साथ, बिल्ट-इन (और सुंदर) महत्वपूर्ण) डेटा प्रकार।

रूबी को प्राथमिक शब्दार्थ में कुछ फायदे हैं - उदाहरण के लिए, पायथन की "सूचियों बनाम ट्यूपल्स" को हटाने से अत्यधिक सूक्ष्म अंतर होता है। लेकिन ज्यादातर स्कोर (जैसा कि मैं इसे रखता हूं, सादगी के साथ एक बड़ा प्लस और सूक्ष्म, चतुर भेद एक उल्लेखनीय ऋण) रूबी के खिलाफ है (जैसे, दोनों बंद और आधे-खुले अंतराल के साथ, अंकन के साथ a.b और a .. .b [कोई भी यह दावा करना चाहता है कि यह स्पष्ट है कि कौन सा है? -)], मूर्खतापूर्ण है - IMHO, बिल्कुल।)। फिर से, जो लोग एक समान भाषा के मूल में बहुत से समान लेकिन सूक्ष्म रूप से अलग-अलग चीजों पर विचार करते हैं, एक MINUS के बजाय एक PLUS, निश्चित रूप से इन "आसपास के अन्य तरीके" से गिनेंगे कि मैं उन्हें कैसे गिनता हूं :-)।

इन तुलनाओं से यह मत समझिए कि दोनों भाषाएं बहुत अधिक हैंअलग, तुम मन। वे नहीं कर रहे हैं लेकिन अगर मुझे "कैपेली डीएंगेलो" की तुलना "स्पेगेटिनी" से करने के लिए कहा जाता है, तो यह इंगित करने के बाद कि ये दो प्रकार के पास्ता किसी के लिए बस अविवेच्य हैं और किसी भी डिश में विनिमेय है जिसे आप तैयार करना चाहते हैं, मैं तब अनिवार्य रूप से होगा इस बात की सूक्ष्म जांच करने के लिए कि कैसे लंबाई और व्यास अलग-अलग होते हैं, कैसे किस्में के सिरों को एक मामले में टेप किया जाता है और दूसरे में नहीं, और इसी तरह - कोशिश करने और समझाने के लिए कि मैं क्यों, व्यक्तिगत रूप से, बल्कि कैपिटल डी होगा 'किसी भी तरह के शोरबा में पास्ता के रूप में एंजेलो, लेकिन इस तरह के लंबे पतले पास्ता रूपों (जैतून का तेल, कीमा बनाया हुआ लहसुन, कीमा बनाया हुआ लाल मिर्च, और बारीक जमीन एन्कोवीज) के लिए उपयुक्त सॉस के साथ जाने के लिए पास्ताच्युत के रूप में स्पेगेटीनी पसंद करेंगे। उदाहरण के लिए - लेकिन अगर आपने लहसुन और मिर्च को उबालने के बजाय कटा हुआ है, तो आपको स्पेगेटी के पतले विस्तार के बजाय स्पेगेटी के साउंड बॉडी का चयन करना चाहिए, और अच्छी तरह से achovies को त्यागने और कुछ ताज़ा स्प्रिंग बेसिल जोड़ने की सलाह दी जाएगी [ या यहां तक ​​कि - मैं एक विधर्मी हूँ ...! - प्रकाश पुदीना ...] पत्ते - पकवान की सेवा करने से पहले बहुत ही कम समय पर)। ओह, क्षमा करें, यह दर्शाता है कि मैं विदेश यात्रा कर रहा हूं और थोड़ी देर के लिए पास्ता नहीं था, मुझे लगता है। लेकिन सादृश्य अभी भी बहुत अच्छा है! -) - प्रकाश पुदीना ...] पत्ते - पकवान की सेवा करने से पहले बहुत ही कम समय पर)। ओह, क्षमा करें, यह दर्शाता है कि मैं विदेश यात्रा कर रहा हूं और थोड़ी देर के लिए पास्ता नहीं था, मुझे लगता है। लेकिन सादृश्य अभी भी बहुत अच्छा है! -) - प्रकाश पुदीना ...] पत्ते - पकवान की सेवा करने से पहले बहुत ही अंतिम समय पर)। ओह, क्षमा करें, यह दर्शाता है कि मैं विदेश यात्रा कर रहा हूं और थोड़ी देर के लिए पास्ता नहीं था, मुझे लगता है। लेकिन सादृश्य अभी भी बहुत अच्छा है! -)

इसलिए, पायथन और रूबी में, हम दो दिग्गजों के पास आते हैं (भाषा की दृष्टि से उचित - पुस्तकालयों को छोड़कर, और अन्य महत्वपूर्ण सहायक उपकरण जैसे उपकरण और वातावरण, प्रत्येक भाषा को कैसे एम्बेड / विस्तारित करें, आदि, आदि) यह अब के लिए - वे वैसे भी प्रत्येक भाषा के सभी कार्यान्वयन पर लागू नहीं होंगे, उदाहरण के लिए, जेथॉन बनाम क्लासिक पायथन, पायथन भाषा के दो कार्यान्वयन हैं!):

  1. रूबी के पुनरावृत्तियों और कोडब्लॉक बनाम पायथन के पुनरावृत्तियों और जनरेटर;

  2. रूबी के कुल, निरंकुश "dynamicity", क्षमता सहित
    "फिर से खोलना" किसी भी मौजूदा वर्ग, सभी में निर्मित सहित, और रन-टाइम में अपने व्यवहार को बदलने के लिए - बनाम अजगर के विशाल लेकिन घिरे dynamicity, जो मौजूदा के व्यवहार में परिवर्तन कभी नहीं अंतर्निहित कक्षाएं और उनके उदाहरण।

व्यक्तिगत रूप से, मैं 1 वॉश पर विचार करता हूं (मतभेद इतने गहरे हैं कि मैं आसानी से लोगों को या तो दृष्टिकोण से घृणा कर सकता हूं और दूसरे को श्रद्धांजलि दे सकता हूं, लेकिन मेरे व्यक्तिगत पैमानों पर प्लस और माइनस के बारे में भी बात करता है); और 2 एक महत्वपूर्ण मुद्दा - एक जो रूबी को "टिंकरिंग" के लिए अधिक उपयुक्त बनाता है, लेकिन बड़े उत्पादन अनुप्रयोगों में उपयोग के लिए ब्यूट पायथन समान रूप से अधिक उपयुक्त है। यह एक तरह से मज़ेदार है, क्योंकि दोनों भाषाएं अन्य लोगों की तुलना में बहुत अधिक गतिशील हैं, इसलिए अंत में मेरे पीओवी से उनके बीच का महत्वपूर्ण अंतर उस पर टिका होना चाहिए - कि रूबी इस संबंध में "ग्यारह हो जाती है" (संदर्भ यहाँ "स्पाइनल टैप" है, निश्चित रूप से)। रूबी में,मैं कर सकता हूँ ! Ie, मैं गतिशील रूप से अंतर्निहित स्ट्रिंग कक्षा को बदल सकता हूं ताकि एक = "हैलो वर्ल्ड" b = "हैलो वर्ल्ड" हो अगर == b प्रिंट "बराबर! \ N" और प्रिंट "अलग! \ N" अंत में प्रिंट होगा! बराबरी का"। अजगर में, वहाँ कोई रास्ता नहीं मैं ऐसा कर सकता है। मेटाप्रोग्रामिंग के उद्देश्यों के लिए, प्रायोगिक ढांचे को लागू करना, और जैसे, रूबी की यह अद्भुत गतिशील क्षमता बेहद महत्वपूर्ण है आकर्षक। लेकिन - अगर हम बड़े अनुप्रयोगों के बारे में बात कर रहे हैं, तो कई लोगों द्वारा विकसित किया गया है और इससे भी अधिक बनाए रखा गया है, जिसमें विभिन्न स्रोतों से पुस्तकालयों के सभी प्रकार शामिल हैं, और ग्राहक साइटों में उत्पादन में जाने की आवश्यकता है ... ठीक है, मैं नहीं चाहता हूं ऐसी भाषा जो बहुत ही गतिशील है, बहुत बहुत धन्यवाद। मैं कुछ पुस्तकालय के अनजाने में अन्य असंबंधित लोगों को तोड़ने के बारे में सोचता हूं जो उन तारों पर अलग-अलग भरोसा करते हैं - जो कि कोड के टुकड़ों के बीच गहरे और गहरे छिपे "चैनल" की तरह है, जो अलग-अलग दिखते हैं और अलग-अलग होते हैं, जो मौत में मंत्र देते हैं बड़े पैमाने पर प्रोग्रामिंग। किसी भी मॉड्यूल को किसी भी अन्य "गुप्त रूप से" व्यवहार को प्रभावित करने देने से, अंतर्निहित प्रकार के शब्दार्थों को उत्परिवर्तित करने की क्षमता सिर्फ उत्पादन अनुप्रयोग प्रोग्रामिंग के लिए एक बीएडी विचार है,

अगर मुझे इतने बड़े एप्लिकेशन के लिए रूबी का उपयोग करना था, तो मैं कोडिंग-शैली प्रतिबंधों पर भरोसा करने की कोशिश करूंगा, बहुत सारे परीक्षण (जब भी कुछ भी बदल जाए - फिर भी पूरी तरह से असंबंधित होना चाहिए ...), और पसंद इस भाषा सुविधा के उपयोग को प्रतिबंधित करने के लिए। लेकिन पहली जगह में फ़ीचर न होना और भी बेहतर है, मेरी राय में - जैसे कि पायथन खुद भी एप्लिकेशन प्रोग्रामिंग के लिए एक बेहतर भाषा होगी यदि एक निश्चित संख्या में बिल्ट-इन "नॉट डाउन" हो सकता है, तो मैं KNEW कि जैसे, लेन ( "Ciao") 4 (बल्कि किसी के नाम के बंधन बदल कि क्या के बारे में चिंता subliminally के लिए होने से 'लेन' में builtins मॉड्यूल ...)। मुझे उम्मीद है कि अंततः पायथन अपने बिल्ट-इन को "नेल डाउन" करता है।

लेकिन समस्या का मामूली, चूंकि निर्मित बिल्ट को रीबाइंड करना काफी पदावनत करने के साथ-साथ पाइथन में एक दुर्लभ अभ्यास है। रूबी में, यह मुझे प्रमुख बनाता है - ठीक उसी तरह जैसे अन्य भाषाओं की शक्तिशाली मैक्रो सुविधाएं (जैसे, कहते हैं, डायलन) मेरे अपने विचार में समान जोखिम प्रस्तुत करती हैं (मुझे आशा है कि पायथन को कभी भी इतनी शक्तिशाली मैक्रो प्रणाली नहीं मिलती, नहीं मामला "लोगों को अपने स्वयं के डोमेन-विशिष्ट छोटी भाषाओं को भाषा में ही परिभाषित करने देने" - यह IMHO, आवेदन प्रोग्रामिंग के लिए पायथन के अद्भुत उपयोगिता को प्रभावित करता है, जो होने वाले टिंकर के लिए "आकर्षक उपद्रव" पेश करके। हर प्रोग्रामर के दिल में लर्क ...)।

एलेक्स


9

कुछ अन्य लोगों से:

http://www.ruby-lang.org/en/documentation/ruby-from-other-languages/to-ruby-from-python/

(यदि मैंने रूबी की ओर से किसी भी चीज़ की गलत व्याख्या की है या उस पेज को अपडेट कर दिया गया है, तो कोई ऐसा महसूस करता है कि वह संपादित करने के लिए स्वतंत्र है ...)

रूबी में स्ट्रिंग्स उत्परिवर्तित होते हैं, पायथन में नहीं (जहां "परिवर्तन" द्वारा नए स्ट्रिंग्स बनाए जाते हैं)।

रूबी के पास कुछ लागू किए गए मामले हैं, पायथन नहीं करता है।

पायथन में सूचियाँ और टुपल्स (अपरिवर्तनीय सूचियाँ) दोनों हैं। रूबी के पास पायथन सूचियों के अनुरूप सरणियाँ हैं, लेकिन उनमें से कोई भी अपरिवर्तनीय संस्करण नहीं है।

पायथन में, आप सीधे ऑब्जेक्ट विशेषताओं तक पहुंच सकते हैं। रूबी में, यह हमेशा विधियों के माध्यम से होता है।

रूबी में, विधि कॉल के लिए कोष्ठक आमतौर पर वैकल्पिक होते हैं, लेकिन पायथन में नहीं।

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

पायथन में कई विरासत हैं। रूबी के पास "मिश्रण" है।

और एक और बहुत ही प्रासंगिक लिंक:

http://c2.com/cgi/wiki?PythonVsRuby

जो, विशेष रूप से, एलेक्स मार्टेली द्वारा एक और अच्छे के लिए लिंक , जो एसओ पर यहां बहुत सारे महान सामान पोस्ट कर रहा है:

http://groups.google.com/group/comp.lang.python/msg/028422d707512283


1
रूबी में आप बस इसे कुछ अपरिवर्तनीय में बदलने के लिए अपने सरणी को फ्रीज कर सकते हैं
user163365

एलेक्स
मार्टेली

8

मैं इस बारे में अनिश्चित हूं, इसलिए मैं इसे पहले एक जवाब के रूप में जोड़ता हूं।

पायथन अनबाउंड तरीकों को कार्यों के रूप में मानता है

इसका मतलब है कि आप किसी विधि को पसंद theobject.themethod()या कह सकते हैं TheClass.themethod(anobject)

संपादित करें: हालांकि पायथन में विधियों और कार्यों के बीच का अंतर छोटा है, और पायथन 3 में गैर-मौजूद है, यह रूबी में भी मौजूद नहीं है, सिर्फ इसलिए कि रूबी के पास कार्य नहीं हैं। जब आप कार्यों को परिभाषित करते हैं, तो आप वास्तव में ऑब्जेक्ट पर तरीकों को परिभाषित कर रहे हैं।

लेकिन आप अभी भी एक वर्ग की विधि नहीं ले सकते हैं और इसे एक फ़ंक्शन के रूप में कॉल कर सकते हैं, आपको इसे उस ऑब्जेक्ट से रिबेट करना होगा जिसे आप कॉल करना चाहते हैं, जो बहुत अधिक बाधा है।


रूबी के पास फंक्शन नहीं हैं। कहा कि, TheClass.instance_method(:themethod).bind(anobject).callबराबर माणिक होगा।
लोगान कैपाल्डो

ओह। तो किसी प्रकार का जादू मुख्य वर्ग है जब आप एक फ़ंक्शन को परिभाषित करते हैं जो एक स्पष्ट वर्ग पर नहीं है?
लेनार्ट रेगेब्र जूल

हां, शीर्ष स्तर पर परिभाषित तरीके निजी तरीके हैं Object
लोगान कैपेल्डो

1
एफडब्ल्यूआईडब्ल्यू, ऐसा लगता है कि पायथन में, फ़ंक्शन और विधियां वास्तव में एक ही प्रकार हैं, और उनका अलग व्यवहार वर्णनकर्ताओं से आता है: users.rcn.com/python/download/…
बैस्टियन लेओनार्ड

1
लेकिन अगर आप इसे किसी वस्तु से बांधते हैं, तो यह अनबाउंड नहीं है। ओह। :-) और वे पायथन में भी वही हैं। यह सिर्फ इतना है कि रूबी वास्तव में कार्य नहीं करता है। और इसका मतलब है कि मेरा कथन सही है। आप एक अनबाउंड विधि कह सकते हैं जैसे कि यह पायथन में एक फ़ंक्शन था। और यह वास्तव में उपयोगी है, उदाहरण के लिए इसका मतलब है कि आप किसी वर्ग पर परिभाषित एक विधि को कॉल कर सकते हैं जिसमें वह वर्ग नहीं है, जो कभी-कभी उपयोगी होता है।
लेन्नर्ट रेगेब्र

7

मैं पायथन डिस्क्रिप्टर एपीआई का उल्लेख करना चाहूंगा जो एक अनुकूलित वस्तु-से-विशेषता "संचार" की अनुमति देता है। यह भी उल्लेखनीय है कि, पायथन में, कोई भी __getattribute__विधि के डिफ़ॉल्ट कार्यान्वयन के माध्यम से दिए गए डिफ़ॉल्ट को ओवरराइड करके वैकल्पिक प्रोटोकॉल को लागू करने के लिए स्वतंत्र है । मुझे उपर्युक्त के बारे में अधिक जानकारी दें। डिस्क्रिप्टर्स नियमित कक्षाएं हैं __get__, __set__और / या __delete__विधियां हैं। जब दुभाषिया कुछ का सामना करता है anObj.anAttr, तो निम्न कार्य किया जाता है:

  • __getattribute__विधि anObjहै
  • __getattribute__ वर्ग से AAttr वस्तु को पुनः प्राप्त करता है
  • यह जाँच करता है abAttr वस्तु है या नहीं __get__, __set__या __delete__प्रतिदेय वस्तुओं
  • संदर्भ (यानी, कॉलर ऑब्जेक्ट या क्लास, और वैल्यू, बाद के बजाय, अगर हमारे पास सेटर है) कॉल करने योग्य ऑब्जेक्ट को पास किया जाता है
  • परिणाम वापस आ गया है।

जैसा कि उल्लेख किया गया था, यह डिफ़ॉल्ट व्यवहार है। एक प्रोटोकॉल को फिर से लागू करके बदलने के लिए स्वतंत्र है __getattribute__

यह तकनीक डेकोरेटर्स की तुलना में बहुत अधिक शक्तिशाली है।


6

रूबी ने बिल्डिन निरंतरता का समर्थन किया है callcc

इसलिए आप एंबी-ऑपरेटर जैसी शांत चीजों को लागू कर सकते हैं


काश मुझे कॉलक समझ में आता। क्या आप मैकार्थी के एंबिगस संचालक की तुलना में अधिक सांसारिक अनुप्रयोग परिदृश्य प्रदान कर सकते हैं, जिससे उसके मेरिट की सराहना की जा सके? मेरा मतलब है कुछ वास्तविक दुनिया, नहीं है कि कायरता सीएस सामान ?!
थॉमस जूल

"फंकी सीएस सामान" वास्तविक है। सीखने के लिए कुछ समय लें: intertwingly.net/blog/2005/04/13/Continuations-for-Curmudgeons
Stephen Eilert


5

अजगर के पास डॉकस्ट्रिंग्स हैं और माणिक नहीं है ... या यदि ऐसा नहीं है, तो वे आसानी से अजगर के रूप में सुलभ नहीं हैं।

Ps। यदि im गलत है, तो कृपया, एक उदाहरण छोड़ दें? मेरे पास एक वर्कअराउंड है जिसे मैं कक्षाओं में काफी आसानी से बंद कर सकता हूं, लेकिन मैं "देशी तरीके" में एक सुविधा का डॉकस्ट्रिंग थोथा करना चाहता हूं।


3
doesn docstring है, लेकिन, RDoc है। तो हाँ, आसानी से उपलब्ध नहीं है, लेकिन 100% छिपा नहीं है।
उमर कुरैशी

रूबी डॉकस्ट्रिंग्स का उपयोग नहीं करती है। यह एक अलग तरीके से प्रलेखन करता है।
चक

1
उमर: हाँ, मैं rdoc लेकिन afaik के बारे में जानता हूँ, वे अजगर के रूप में "सुलभ" नहीं हैं। उदाहरण के लिए, अगर मेरे पास एक क्लास है और मैं rdoc डॉक्यूमेंटेशन को क्लास के भीतर से उसकी बहुत मोटी नौकरी के लिए आउटपुट देना चाहता हूँ। मैंने क्या किया है कि मैं री प्रलेखन उत्पन्न करता हूं जिसे मैं up2date रखने की कोशिश करता हूं और फिर उस जानकारी को पुन: प्राप्त करता हूं। निश्चित रूप से अजगर के
डॉक्टर

डॉकस्ट्रिंग का उपयोग सिद्धांत प्रदान करने के लिए किया जा सकता है। क्या रूबी के लिए ऐसा कुछ है?
लेनार्ट रेगेब्र जूल 11'09

2
हां, इसे "रूबी डॉक्टेस्ट" कहा जाता है। जहां तक ​​सिद्धांतों का सवाल है, यह सब वास्तव में मायने रखता है कि आपके पास पठनीय प्रलेखन कहीं है जिसमें परीक्षण योग्य कोड स्निपेट शामिल हैं - इससे कोई फर्क नहीं पड़ता कि यह डॉकस्ट्रिंग में है या टिप्पणी में।
चक

5

रूबी के पास कमांड फाइल से इनपुट फाइल्स ('-n' फ्लैग) पर लाइन लूप द्वारा एक लाइन है ताकि इसे AWK की तरह इस्तेमाल किया जा सके। यह रूबी एक-लाइनर:

ruby -ne 'END {puts $.}'

AWK वन-लाइनर की तरह लाइनों की गिनती करेगा:

awk 'END{print NR}'

रूबी को पेरल के माध्यम से यह सुविधा मिलती है, जिसने इसे AWK से पेरल के साथ बोर्ड पर sysadmins प्राप्त करने के तरीके के रूप में लिया, ताकि वे चीजों को करने के तरीके को बदल सकें।


1
मैं जोड़ना चाहता हूं कि पायथन की कमांड लाइन का समर्थन कमजोर है। अनुपस्थित स्वचालित लूप के अलावा आप एक पंक्ति में कुछ कथन नहीं डाल सकते हैं और दुभाषिया के लिए एकल-स्ट्रिंग कमांड लाइन तर्क के रूप में इसे पास कर सकते हैं। कम से कम मैं ऐसा करने में असफल रहा।
थॉमस

निःसंदेह तुमसे हो सकता है। लेकिन आप (किसी भी ओथेर भाषा के साथ) उद्धरण में बताने की आवश्यकता होगी।
लेन्नर्ट रेग्रोब

पायथन को कमांडलाइन पर उपयोग करने के लिए नहीं बनाया गया है, क्योंकि आपको कुछ चीजों के बारे में स्पष्ट होना है (जैसे sys.stdin) यदि आप इसे इस तरह से उपयोग करना चाहते हैंpython -c "import sys; print len(list(sys.stdin))"
u0b34a0f6ae

5

रूबी में सिगिल और ट्विगल हैं, पायथन नहीं है।

संपादित करें : और एक बहुत ही महत्वपूर्ण चीज जिसे मैं भूल गया (आखिरकार, पिछली बस थोड़ी सी लौ करने के लिए थी :-p):

अजगर एक JIT कम्पाइलर (है Psyco ), तेजी से कोड (लिखने के लिए एक छबीला निचले स्तर भाषा Pyrex ) और इनलाइन सी ++ कोड जोड़ने की क्षमता ( Weave )।


सच है, लेकिन यह सिर्फ वाक्यविन्यास है।
लेन्आर्ट रेगेब्र जूल 11'09

6
ठीक है, अगर आप उस सड़क से नीचे जाना चाहते हैं: दोनों ट्यूरिंग-पूर्ण हैं। बाकी सब सिर्फ वाक्यविन्यास है।
जोर्ग डब्ल्यू मित्तग

हाँ और एक आयात वाक्यविन्यास अंतर ;-)
फोरट्रान

1
अगर आप @foo या self.foo लिखते हैं तो यह कैसे महत्वपूर्ण है?
लेन्नर्ट रेगेब्र जूल

1
@ Jörg: ठीक है, इसे "सिंटैक्स" के अलावा कुछ और कहें। मुद्दा यह है कि @foo और self.foo एक ही बात करता है, यह वास्तव में एक कार्यक्षमता नहीं है रूबी है और पायथन नहीं करता है।
लेनर्ट रेगेब्र जूल

5

मेरे अजगर की ज़ंग खाया हुआ है, इसलिए इनमें से कुछ अजगर में हो सकते हैं और मुझे अभी याद नहीं है / पहली जगह में कभी नहीं सीखा है, लेकिन यहाँ पहले कुछ हैं जो मैंने सोचा था:

श्वेत रिक्ति

रूबी व्हॉट्सएप को बिल्कुल अलग तरह से हैंडल करती हैं। शुरुआत के लिए, आपको किसी भी चीज़ को इंडेंट करने की ज़रूरत नहीं है (जिसका मतलब है कि 4 स्पेस या 1 टैब का उपयोग करने से कोई फर्क नहीं पड़ता)। यह स्मार्ट लाइन निरंतरता भी करता है, इसलिए निम्नलिखित मान्य है:

def foo(bar,
        cow)

मूल रूप से, यदि आप एक ऑपरेटर के साथ समाप्त होते हैं, तो यह पता लगाता है कि क्या चल रहा है।

mixins

रूबी में मिश्रण होते हैं जो पूरी कक्षाओं के बजाय उदाहरणों का विस्तार कर सकते हैं:

module Humor
  def tickle
    "hee, hee!"
  end
end
a = "Grouchy"
a.extend Humor
a.tickle    »   "hee, hee!"

enums

मुझे यकीन नहीं है कि अगर यह जनरेटर के समान है, लेकिन रूबी 1.9 के रूप में एनम के रूप में रूबी है, इसलिए

>> enum = (1..4).to_enum
=> #<Enumerator:0x1344a8>

संदर्भ: http://blog.nuclearsquid.com/writings/ruby-1-9-what-s-new-what-s-changed

"कीवर्ड तर्क"

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

def foo(a, b=2, c=3)
  puts "#{a}, #{b}, #{c}"
end
foo(1,3)   >> 1, 3, 3
foo(1,c=5) >> 1, 5, 3
c          >> 5

ध्यान दें कि c = 5 वास्तव में चर c को मान 5 में निर्दिष्ट करता है, और पैरामीटर b को मान 5 सेट करता है।

या आप इसे हैश के साथ कर सकते हैं, जो दूसरे मुद्दे को संबोधित करता है

def foo(a, others)
  others[:b] = 2 unless others.include?(:b)
  others[:c] = 3 unless others.include?(:c)
  puts "#{a}, #{others[:b]}, #{others[:c]}"
end
foo(1,:b=>3) >> 1, 3, 3
foo(1,:c=>5) >> 1, 2, 5

संदर्भ: द प्रोगैमिक प्रोगैमर गाइड टू रूबी


आपका दूसरा उदाहरण foo (1, c = 5) वह नहीं करता है जो आप सोचते हैं कि यह करता है। रूबी का नाम पैरामीटर नहीं है।
घोड़ागुजे

5
पायथन में कोष्ठक के अंदर निहित लाइन निरंतरता है (, [या{
u0b34a0f6ae

5

आप रूबी और पायथन दोनों में वर्ग परिभाषा में कोड रख सकते हैं। हालांकि, रूबी में आपके पास कक्षा (स्वयं) का संदर्भ है। पायथन में आपके पास कक्षा का संदर्भ नहीं है, क्योंकि कक्षा अभी तक परिभाषित नहीं हुई है।

एक उदाहरण:

class Kaka
  puts self
end

इस मामले में स्वयं वर्ग है, और यह कोड "काका" को प्रिंट करेगा। पायथन में क्लास डेफिनेशन बॉडी से क्लास का नाम या अन्य तरीके से प्रिंट करने का कोई तरीका नहीं है।


क्या आप अपने पहले बिंदु के लिए अधिक विवरण (जैसे कोड) प्रदान कर सकते हैं?
लूस्क वोल्फ

उदाहरण कोड एक अच्छा विचार है, मैंने कहा कि भले ही यह मामला तुच्छ हो।
लेन्नर्ट रेगेब्र जूल 11'09

@SilentGhost: मैं एक के बारे में नहीं सोच सकता जो वास्तव में अभी अस्पष्ट नहीं है। :)
लेन्एर्ट रेगेब्र जूल 11'09

आप अजगर के वर्ग के अंदर वर्ग नाम का उपयोग कर सकते हैं: वर्ग फू (): init __ (स्व: प्रिंट सेल्फ .__ वर्ग ।__ name__
txwikinger

1
@txwikinger: हाँ, लेकिन वर्ग के शरीर के भीतर नहीं, जिसे classकथन के रूप में उसी समय निष्पादित किया जाता है ।
बैस्टियन लेओनार्ड

4

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

मानक संकेतन यह स्पष्ट करता है कि हम उन संख्याओं के बारे में बात कर रहे हैं जो उन्हें अस्पष्ट बनाने के लिए क्रम बनाते समय कह रहे हैं। उपसर्ग और उपसर्ग संकेतन क्रम बनाता है जिसमें संख्याओं को अस्पष्ट बनाते हुए सादे की गणना करना है। पायथन में पहले से ही मल्टीलाइन लैम्ब्डा होगा यदि यह सिनेटिक व्हाट्सएप के कारण होने वाली कठिनाइयों के लिए नहीं था। (स्पष्ट ब्लॉक सीमांकक को जोड़ने के बिना प्रस्ताव इस तरह की चीज को खींचने के लिए मौजूद हैं।)

मुझे ऐसी स्थितियाँ लिखना आसान लगता है, जहाँ मैं कुछ घटित करना चाहता हूँ यदि कोई शर्त गलत है, जब तक कि रूबी में बयान नहीं दिया जाए, जब तक कि रूबी में बयान नहीं दिया गया हो, उदाहरण के लिए रूबी या अन्य भाषाओं में "अगर-नहीं" निर्माण। यदि आज लोग जिन भाषाओं का उपयोग कर रहे हैं उनमें से अधिकांश शक्ति में समान हैं, तो प्रत्येक भाषा के वाक्य विन्यास को एक तुच्छ वस्तु कैसे माना जा सकता है? विशिष्ट विशेषताओं जैसे ब्लॉक और इनहेरिटेंस मैकेनिज्म आदि के बाद वाक्य रचना एक भाषा का सबसे महत्वपूर्ण हिस्सा है, शायद ही कोई सतही चीज।

सतही क्या सौंदर्य के सौंदर्य गुण हैं जो हम वाक्य रचना में लिखते हैं। सौंदर्यशास्त्र का इससे कोई लेना-देना नहीं है कि हमारी अनुभूति कैसे काम करती है, वाक्य रचना।


यह "टिप्पणी" तब तक तीन बार होती है जब तक किसी टिप्पणी में अनुमति दी जाती है, चाहे वह किसी भी प्रकार की हो।
एंड्रयू ग्रिम

यह वास्तव में मेरे लिए एक जवाब के रूप में ठीक लगता है। "यह एक टिप्पणी है" थोड़ा संपादित।
छिपकली

3

रूबी के "मेथड मिसिंग" मेकेनिज्म के बारे में कुछ भी नहीं देखा गया है। मैं उस भाषा सुविधा की शक्ति के एक उदाहरण के रूप में, रेल में find_by _... तरीकों का उदाहरण दूंगा। मेरा अनुमान है कि पायथन में कुछ ऐसा ही लागू किया जा सकता है, लेकिन मेरे ज्ञान में यह मूल रूप से नहीं है।


पायथन को get_attribute मिला है , जो मूल रूप से रूबी के तरीके_स्मिसिंग के समान है।
मियादी

3
जब माणिक कहीं भी उल्लेख किया जाता है तो अजगर डेवलपर्स को हमेशा इतनी चोट क्यों मिलती है? आप इसे अस्वीकार नहीं कर सकते यह सच नहीं है।
अरोना

method_missingकुछ मामलों में पायथन में अनुकरण किया जा सकता है class M(): def __getattr__(self, n): return lambda: "Missing! " + n; M().hi():। हालांकि, मामूली अंतर हैं और मुझे संदेह है कि यह अजगर :-) में मुहावरेदार है

1
@DJTripleThreat: मैं इनकार करता हूं कि यह सच है।
लेन्नर्ट रेगेब्र

3

पाइथन और रूबी के बीच लैम्ब्डा में एक और अंतर पॉल ग्राहम की एक्सीमुलेटर जेनरेटर समस्या से प्रदर्शित होता है। यहाँ पुनर्मुद्रित:

एक फ़ंक्शन फू लिखें जो एक संख्या n लेता है और एक फ़ंक्शन देता है जो एक संख्या i लेता है, और i द्वारा संवर्धित n लौटाता है। नोट: (ए) यह संख्या है, पूर्णांक नहीं, (बी) जो कि वेतन वृद्धि है, न कि प्लस।

रूबी में, आप यह कर सकते हैं:

def foo(n)
  lambda {|i| n += i }
end

पायथन में, आप n की स्थिति को रखने के लिए एक ऑब्जेक्ट बनाएंगे:

class foo(object):
    def __init__(self, n):
        self.n = n
    def __call__(self, i):
        self.n += i
        return self.n

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


3
आप पायथन में संख्या में वृद्धि नहीं कर सकते, ताकि प्रतिबंध का कोई मतलब नहीं हो। अजगर संख्या में अपरिवर्तनीय हैं। यदि हम इसके बजाय इसे "प्लस" में बदलते हैं, तो कक्षा अनावश्यक है। इसलिए यह लैम्ब्डा अंतर के बारे में कुछ भी प्रदर्शित नहीं करता है, लेकिन संख्या कैसे काम करती है, इसका अंतर। जब तक बेशक आप एक उत्परिवर्ती संख्या वर्ग नहीं बनाते हैं। :)
लेन्नर्ट रेग्रोब

2
वांछित व्यवहार को स्पष्ट करने के लिए प्रतिबंध है। समस्या क्या पूछ रही है: f = foo (10) f (2) >> 12 f (3) >> 15 ... नंबा {} | n + i} देता है: f = foo (10) f (2) >> 12 f (3) >> 13 ... संख्या रूबी में भी अपरिवर्तनीय हैं - आप उदाहरण के लिए 2 + = 1 नहीं कह सकते। और n + = 1 एक नियमित पायथन फ़ंक्शन में ठीक है, लेकिन लैम्बडा नहीं। तो यह "n" की बात है, यह तथ्य यह है कि यह तब बनता है जब फ़ंक्शन को आमंत्रित किया जाता है और लैम्बडा का गठन होता है, कि आप लैम्बडा (केवल अभिव्यक्तियों के बजाय) में असाइनमेंट कर सकते हैं, और यह n का मान रख सकता है एकाधिक कॉल पर।
dormsbee

मुझे नहीं लगता कि आपको पायथन में इतनी लंबाई में जाने की जरूरत है। कार्यों को अन्य कार्यों के भीतर परिभाषित किया जा सकता है। def foo(n): def f(i): return n + i return f
FMc

2
हालांकि यह अभी भी समान नहीं है, और आपका उदाहरण ऊपर की टिप्पणी में पायथन लैम्ब्डा के बराबर है। रूबी संस्करण एक लैम्ब्डा बनाता है जो कॉल के बीच स्थिति रखता है। आपके द्वारा पोस्ट किया गया उदाहरण आपको n के लिए एक शुरुआती मूल्य को कॉन्फ़िगर करने देता है, लेकिन जो फ़ंक्शन फू रिटर्न देता है, उसमें हमेशा वह मूल्य होता है। रूबी संस्करण वेतन वृद्धि। तो चलिए बताते हैं f = foo (10)। पायथन संस्करण: f (1) => 11, f (1) => 11. रूबी संस्करण f.call (1) => 11, f.call (1) => 12.
dormsbee

def foo(n): L=[n] def f(i): L[0] += i return L[0] return f। Python3 में आप nonlocalकीवर्ड का उपयोग कर सकते हैं ।
JFS

3

अजगर ने वैकल्पिक तर्कों का नाम दिया है

def func(a, b=2, c=3):
    print a, b, c

>>> func(1)
1 2 3
>>> func(1, c=4)
1 2 4

AFAIK रूबी ने केवल तर्क दिए हैं क्योंकि फ़ंक्शन घोषणा में b = 2 एक प्रभाव है जो हमेशा अपील करता है।


3
क्या है "रूबी ने केवल तर्क दिए हैं क्योंकि फ़ंक्शन घोषणा में b = 2 एक ऐसा प्रभाव है जो हमेशा अपील करता है" यहां तक ​​कि मतलब है?
अश्वारोही

3
डननो आप किस ग्रह पर रहते हैं, लेकिन def my_method(param1, optional = false)रूबी 1.8.6, 1.8.7 और संभवतः 1.9 में काम करता है!
रॉबर्ट के

5
दुष्ट पिस्सू, और लोगों ने उसकी टिप्पणी को खारिज कर दिया, आपने उदाहरण को करीब से नहीं देखा। वह कॉल bमें पैरामीटर को छोड़ सकता है funcऔर यह अभी भी अपने डिफ़ॉल्ट को बनाए रखता है। यही है, bहस्ताक्षर में दूसरा तर्क है, लेकिन वह दूसरे पैरामीटर के साथ उपसर्ग करके इसे छोड़ सकता है c=। रूबी इस का अनुकरण करने के लिए हैश का उपयोग करती है, लेकिन यह बिल्कुल वैसा नहीं है।
7:41 पर maček

2

रूबी के पास दस्तावेज हैं:

 =begin

 You could use rdoc to generate man pages from this documentation

 =end

5
Docstrings आपके द्वारा सेट की गई विधियों / वर्गों के एक भाग के रूप में समाप्त होती हैं। तो आप मदद (वर्ग) कर सकते हैं और यह आपको
डॉकस्ट्रिंग्स


2

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

कार्गो के साथ आप " अपने नाम स्थान को अव्यवस्थित किए बिना पुस्तकालयों की आवश्यकता कर सकते हैं "।

# foo-1.0.0.rb
class Foo
  VERSION = "1.0.0"
end

# foo-2.0.0.rb
class Foo
  VERSION = "2.0.0"
end
>> Foo1 = आयात ("foo-1.0.0")
>> Foo2 = आयात ("foo-2.0.0")
>> Foo1 :: संस्करण
=> "1.0.0"
>> F22 :: संस्करण
=> "2.0.0"

इसके बजाय एक टिप्पणी होनी चाहिए थी, एक नया जवाब नहीं।
लेन्नर्ट रेगेब्र
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.