রুবির কী আছে যে পাইথন নেই এবং বিপরীতে?


263

পাইথন বনাম রুবির নিয়ে প্রচুর আলোচনা রয়েছে এবং আমি তাদের সবাইকে সম্পূর্ণরূপে অস্বাস্থ্যকর বলে মনে করি, কারণ তারা সকলেই ঘুরিয়ে ঘুরিয়ে ফিরিয়েছে যে এক্স বৈশিষ্ট্যটি ভাষা ওয়াইতে সাফ করে, বা এই দাবী ভাষায় এক্স নেই, যদিও বাস্তবে তা ঘটে না। আমি ঠিক জানি কেন আমি পাইথনকে প্রাধান্য দিই তবে এটি বিষয়গতও বটে, এবং কাউকে বেছে নিতে সহায়তা করবে না, কারণ তাদের মতো বিকাশের ক্ষেত্রে আমার মতো পছন্দ নাও থাকতে পারে।

অতএব উদ্দেশ্যমূলকভাবে পার্থক্যগুলি তালিকাবদ্ধ করা আকর্ষণীয় হবে। সুতরাং কোনও "পাইথনের ল্যাম্বডাস চুষে দেয়"। পরিবর্তে রুবির ল্যাম্বডাস পাইথনের যেটি পারে না তা কী তা ব্যাখ্যা করুন। সাবজেক্টিভিটি নেই। উদাহরণ কোড ভাল!

দয়া করে একটি উত্তরে বেশ কয়েকটি পার্থক্য নেই have এবং আপনি যা জানেন তাদের সঠিক ভোট দিন এবং আপনি জানেন তাদের ভুল (বা বিষয়ভিত্তিক) down এছাড়াও, সিনট্যাক্সের মধ্যে পার্থক্য আকর্ষণীয় নয়। আমরা জানি পাইথন বন্ধনী এবং শেষের সাহায্যে রুবি যা করেন তা ইনডেন্টেশন দিয়ে করেন এবং সেই @ কে পাইথনে স্ব বলা হয়।

আপডেট: এটি এখন একটি সম্প্রদায় উইকি, তাই আমরা এখানে বড় পার্থক্য যুক্ত করতে পারি।

রুবীর ক্লাস বডিতে একটি ক্লাস রেফারেন্স রয়েছে

রুবিতে আপনার কাছে ক্লাস বডিতে ইতিমধ্যে ক্লাসের (স্ব) একটি রেফারেন্স রয়েছে। পাইথনে ক্লাসের নির্মাণ শেষ না হওয়া পর্যন্ত আপনার কাছে ক্লাসের কোনও রেফারেন্স নেই।

একটি উদাহরণ:

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,।

রুবির পার্লের মতো স্ক্রিপ্টিং বৈশিষ্ট্য রয়েছে

রুবিতে প্রথম শ্রেণীর রেজেক্সপস, ari -ভেরিয়েবলস, লাইন ইনপুট লুপ দ্বারা আঁকা / পার্ল লাইন এবং অন্যান্য বৈশিষ্ট্য রয়েছে যা এটি ছোট শেল স্ক্রিপ্টগুলি লেখার পক্ষে আরও উপযুক্ত করে তোলে যা পাঠ্য ফাইলগুলিকে আবদ্ধ করে দেয় বা অন্যান্য প্রোগ্রামগুলির জন্য আঠালো কোড হিসাবে কাজ করে।

রুবির প্রথম শ্রেণির ধারাবাহিকতা রয়েছে

কলসিসি বিবৃতি ধন্যবাদ। পাইথনে আপনি বিভিন্ন কৌশল দ্বারা ধারাবাহিকতা তৈরি করতে পারেন, তবে ভাষাটিতে কোনও সমর্থন নেই।

রুবির ব্লক রয়েছে

"কর" বিবৃতি দিয়ে আপনি রুবিতে একাধিক-লাইন বেনামি ফাংশন তৈরি করতে পারেন, যা করার সামনের পদ্ধতিতে একটি যুক্তি হিসাবে পাঠানো হবে এবং সেখান থেকে ডাকা হবে। পাইথনে আপনি পরিবর্তে কোনও পদ্ধতি পাস করে বা জেনারেটর দিয়ে এটি করতে পারেন।

রুবি:

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))

পাইথনে অন্তর্নির্মিত জেনারেটর রয়েছে (যা উপরে বর্ণিত হিসাবে রুবি ব্লকের মতো ব্যবহৃত হয়)

পাইথনের ভাষায় জেনারেটরের পক্ষে সমর্থন রয়েছে। রুবি ১.৮ এ আপনি জেনারেটর মডিউলটি ব্যবহার করতে পারেন যা কোনও ব্লক থেকে জেনারেটর তৈরি করতে ধারাবাহিকতা ব্যবহার করে। অথবা, আপনি কেবল একটি ব্লক / প্রোক / ল্যাম্বদা ব্যবহার করতে পারেন! তদুপরি, রুবিতে ১.৯ ফাইবার রয়েছে, এবং জেনারেটর হিসাবে ব্যবহার করা যায় এবং গণক শ্রেণি একটি অন্তর্নির্মিত জেনারেটর 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ফাইল সহ ডিরেক্টরি রয়েছে ।

পাইথনের ডকস্ট্রিং রয়েছে

ডকাস্ট্রিংস এমন স্ট্রিং যা মডিউল, ফাংশন এবং পদ্ধতিগুলির সাথে সংযুক্ত থাকে এবং রানটাইম এ আত্মরীক্ষণ করা যায়। এটি হেল্প কমান্ড এবং স্বয়ংক্রিয় ডকুমেন্টেশন এর মতো জিনিস তৈরি করতে সহায়তা করে।

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

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

রুবির সমতুল্য জাভাডোকের সমান এবং এটির পরিবর্তে পদ্ধতির উপরে অবস্থিত। এগুলি 1.9 এর পদ্ধতি # উত্স_লোকেশন উদাহরণ ব্যবহারের মাধ্যমে ফাইলগুলি থেকে রানটাইমে পুনরুদ্ধার করা যায়

পাইথনের একাধিক উত্তরাধিকার রয়েছে

রুবি ("উদ্দেশ্যে" নয়) - রুবির ওয়েবসাইট দেখুন, রুবিতে এটি কীভাবে করা হয়েছে তা এখানে দেখুন )। এটি মডিউল ধারণাটি এক ধরণের বিমূর্ত শ্রেণির হিসাবে পুনরায় ব্যবহার করে না।

পাইথনের তালিকা / ডিক সংজ্ঞা রয়েছে

পাইথন:

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)

পাইথন ২.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
একাধিক উত্তরাধিকারের সাথে সম্পর্কিত, কেবল "রুবি তা করেন না" বলা অসম্পূর্ণ। পাইথনে একাধিক উত্তরাধিকার যা আপনি মডিউল / "মিক্সিন ইনহেরেটেন্স" দিয়ে রুবিতে করতে পারবেন না সে সম্পর্কে আমি কিছুই ভাবতে পারি না। (এটি এমনকি বিতর্কিত যে মডিউল সহ শুধু সাধারণ ব্যাপার হল একাধিক উত্তরাধিকার।)
লোগান Capaldo

2
আপনি একই কাজটি অন্য কোনও উপায়ে করতে পারেন তা হ'ল একটি যুক্তি। আপনি এখানে অন্য কোনও উপায়ে সবকিছু করতে পারেন। এবং যেহেতু মডিউলগুলি ক্লাস নয়, এটি একাধিক উত্তরাধিকার নয়। পাইবিলে এটি কীভাবে করা হয়েছে তার কোড উদাহরণগুলিতে অবদান রাখতে স্বাগত Rub
লেনার্ট রেজেব্রো

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
@ অজ্ঞাতসারে: ঠিক আছে। তবে যদি এটি মুদ্রণের পরিবর্তে কোনও ফাংশন হত তবে এটি কাজ করত। অজগর 3 এ এটি কাজ করে: [প্রিন্ট (ই + 5) ই এর জন্য [1,2,3,4]] এবং যখন এটি ভয়াবহতার কথা আসে তখন আমি মনে করি উপরের রুবি কোডটি ভয়াবহ, সুতরাং এটি স্পষ্টতই বিষয়ভিত্তিক এবং এর ফলে একটি নয় এই প্রশ্নের অংশ। @ জন আমি এটি সমতুল্য বলছি না, আমি বলছি আপনার উদাহরণ থেকে পার্থক্য কী তা স্পষ্ট নয়। @ বাস্টিয়ান, না, তবে আপনি একই রকম কাজ করতে পারবেন তার অর্থ এই নয় যে তারা একই রকম। এখানে otehr করার উপায় থাকলেও এখানে পার্থক্যগুলি তালিকাভুক্ত করা উচিত।
লেনার্ট রেজেব্রো

22
আমি পাইথন প্রোগ্রামার আমি পাই উদাহরণের চেয়ে রুবি ব্লকগুলি আপনাকে কীভাবে আরও কিছু সংক্ষিপ্ত বা আরও সুন্দর কিছু লিখতে সহায়তা করে তার একটি উদাহরণ দেখতে চাই কারণ এতে ব্লক নেই। আপনার উদাহরণটি লিখিত হতে পারে: আমি [1, 2, 3, 4] এ: মুদ্রণ (i + 5)। এটি ব্লক ব্যবহার করে না, তবে এর সংক্ষিপ্ত এবং সুন্দর পাশাপাশি রুবি প্রতিটি উদাহরণ।
ম্যানুয়েল সেরন

10
@ ম্যানুয়েল, প্রসগুলি তুচ্ছ-তুচ্ছ তথ্য স্ট্রাকচারগুলিতে (গাছ, গ্রাফ ...) সংযুক্ত করার জন্য দরকারী যা 'লুপের জন্য' হতে পারে না এবং তাই ট্রান্সভার্সের জন্য বিশেষ পুনরাবৃত্তির প্রয়োজন হয়। ব্লকগুলি, যা বেনামে প্রোকস, আপনাকে একটি অভিব্যক্তিতে ফান্টারটি প্রয়োগ করতে দেওয়া (বনাম সংজ্ঞায়িত করুন তারপর বাস্তবায়ন করুন) যা নাটকীয়ভাবে কোডিংয়ের প্রক্রিয়াটিকে গতি দেয় এবং উদ্দেশ্যকে স্পষ্ট করে দেয়। উদাহরণস্বরূপ, যদি আপনি একটি গ্রাফ ডেটা কাঠামো তৈরি করে থাকেন তবে আপনি একজন 'প্রতিটি' পুনরুক্তি নির্ধারণ করতে পারবেন এবং তারপরে গণ্যমান্য মিশ্রণ করতে পারবেন যা তাত্ক্ষণিকভাবে আপনাকে কয়েক ডজন পুনরুক্তি করার সুযোগ দেয় (সাজান, সমস্ত ?, কোনও ?, গ্রেপ)। এখন আপনি একটি ব্লক কল করুন ...
পক্ষপাত 13

4
@ রোমেডেসিরিয়াক্স, কারণ এর ভাষায় একটি নাম দরকার! তাছাড়া এটি কোনও ফাংশন নয়, একটি ফাংশন অবজেক্ট। রুবি ডক্সের দিকে নজর দেওয়া যাক: "প্রোক অবজেক্টগুলি কোডের ব্লক যা স্থানীয় ভেরিয়েবলগুলির একটি সেটকে আবদ্ধ করা হয়েছে" সুতরাং একটি অনামী প্রোক কেবল ব্লক এবং এটি অবশ্যই কেবল একটি ফাংশন নয়!
পক্ষপাত

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
@ গ্লেন: আপনি যা বলছেন তা পেয়েছি তবে রুবির পুনর্নির্ধারণের কাজগুলি - পদ্ধতিগুলি একটি পৃথক শব্দার্থক ধারণা। আপনি যদি সংজ্ঞা গেমটি খেলতে চান তবে বেশিরভাগ বাধ্যতামূলক কোড হ'ল কার্যগুলি নয় procedures আমি কঠিন হওয়ার চেষ্টা করছি না, এটি কেবলমাত্র আমি বিশ্বাস করি সংজ্ঞা এবং নির্ভুলতা গুরুত্বপূর্ণ। আমি সম্মত UnboundMethodহ'ব যে কোনওটিকে ম্যানেজ করা একটি পিআইটিএ হতে পারে।
রায়পুম

5
@ গ্লেন: সৌন্দর্য দর্শকের চোখে পড়ে। তবুও, পদ্ধতিগুলি সংজ্ঞাটি পূরণ করে প্রথম শ্রেণীর অবজেক্ট (এই ক্ষেত্রে আমি উইকিপিডিয়া সংজ্ঞাটি উল্লেখ করছি)। হতে পারে, আপনার প্রথম শ্রেণির আরও কিছু সংজ্ঞা আছে? প্রথম-শ্রেণিতে ধাবিত হওয়ার জন্য তাদের কি প্ল্যাটিনাম ঘন ঘন ফ্লায়ার কার্ডের প্রয়োজন?
পক্ষপাতিত্ব করুন

4
@ গ্লেন এসওএফএইউ বিভাগটি দেখুন "অন্যান্য লোকেরা আমার জিনিসগুলি সম্পাদনা করতে পারে ?!" - এটি একটি সম্প্রদায় উইকি।
পক্ষপাত

26

শেষ পর্যন্ত সমস্ত উত্তর কিছু স্তরে বিষয়গত হতে চলেছে, এবং এখনও পর্যন্ত পোস্ট করা উত্তরগুলি প্রমাণ করে যে আপনি যে কোনও একটি বৈশিষ্ট্যকে একই ভাষাতে (একই রকম না হলে) অন্য ভাষায় করণীয়যোগ্য নয় এমন দিকে চিহ্নিত করতে পারবেন না can't , যেহেতু উভয় ভাষাই খুব সংক্ষিপ্ত এবং ভাবপূর্ণ।

আমি পাইথনের বাক্য গঠনটি পছন্দ করি। তবে আপনাকে রুবির আসল সৌন্দর্য খুঁজে পেতে সিনট্যাক্সের থেকে খানিকটা গভীর খনন করতে হবে। রুবির ধারাবাহিকতায় জেনের মতো সৌন্দর্য রয়েছে। যদিও কোনও তুচ্ছ উদাহরণ এটি সম্পূর্ণরূপে ব্যাখ্যা করতে পারে না, আমি এখানে কী বোঝাতে চাইছি তা বোঝাতে এখানে একটি নিয়ে আসার চেষ্টা করব।

এই স্ট্রিংয়ের শব্দগুলিকে বিপরীত করুন:

sentence = "backwards is sentence This"

আপনি এটি কীভাবে করবেন সে সম্পর্কে আপনি যখন চিন্তা করেন, আপনি নিম্নলিখিতগুলি করতেন:

  1. বাক্যটিকে কথায় বিভক্ত করুন
  2. কথাগুলি উল্টো করুন
  3. শব্দগুলিকে আবার স্ট্রিংয়ে যুক্ত করুন

রুবিতে, আপনি এটি করতে চাই:

sentence.split.reverse.join ' '

আপনি ঠিক যেমনটি ভাবছেন ঠিক একই অনুক্রমের মধ্যে একটির পরে এক পদ্ধতি কল call

অজগরটিতে এটি আরও দেখতে লাগবে:

" ".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
হা .. এটি আমাকে কেবল স্মরণ করিয়ে দেয় যে কমপক্ষে অজগর ২. * আপনি "সত্য, মিথ্যা = মিথ্যা, সত্য" করতে সক্ষম হয়েছিলেন ... আমি বিশ্বাস করি তারা সঠিকভাবে অজগর ৩.০ এ স্থির করেছেন ... এটি আপনার উচিত করতে বাধা দেওয়া।
টম

11
ব্যক্তিগতভাবে, আমি ভাষা দ্বারা প্রয়োগ করা কঠোর নির্দেশিকা পছন্দ করি কারণ এটি সেই ভাষায় লিখিত সমস্ত কোডকে সামঞ্জস্য করে। এটা তোলে বাধ্য করে নির্দেশিকাও অনুসরণ করা আপনি, এবং আপনার কোড পড়া ডেভেলপারদের এক নজরে কি কি এ বলতে পারেন। বেশিরভাগ পাইথন কোডার একই সাধারণ "স্টাইল" ব্যবহার করার সময়, আমি কিছু বেশ বড় অসঙ্গতি দেখেছি যা রুবিতে সম্ভব হবে না।
শাশা চেদিগোভ

8
@ বাইয়াস - আপনি কেন আমাকে নিম্নচাপ দিচ্ছেন তা আমি নিশ্চিত নই। এই উত্তরটি জিনিসগুলি করার অজগর পদ্ধতির সাথে একমত বা একমত নয়। এটি কেবল সত্যের বিবৃতি।
জেসন বেকার

13
@ জেসন "আমরা এখানে সমস্ত প্রাপ্তবয়স্করা" কি একটি সত্যের বিবৃতি? আমি কল করতে চাই যে একটি মতামত একটি বৈশিষ্ট্যের চারদিকে আবৃত, সুতরাং নীচে ভোট।
পক্ষপাত 1

7
@ বাইয়াস - "আমরা সকলেই এখানে প্রাপ্তবয়স্ক" বলার অর্থ সামান্য হিসাবে বোঝানো হয়নি। এটি একটি বেসরকারী পাইথন নীতিবাক্য, যা আমি বিশ্বাস করি যে এখানে সর্বোত্তমভাবে ব্যাখ্যা করা হয়েছে: mail.python.org/pipermail/tutor/2003-
ইভান পোর্টার

18

আপনি পাইথনের একটি মডিউল থেকে কেবল নির্দিষ্ট ফাংশন আমদানি করতে পারেন। রুবিতে, আপনি পদ্ধতির পুরো তালিকাটি আমদানি করুন। আপনি এগুলিকে রুবিতে "গুরুত্বহীন" করতে পারতেন, তবে এটি সমস্ত কি তা নয়।

সম্পাদনা করুন:

আসুন এই রুবি মডিউলটি নেওয়া যাক:


module Whatever
  def method1
  end

  def method2
  end
end

যদি আপনি এটি আপনার কোডটিতে অন্তর্ভুক্ত করেন:


include Whatever

আপনি দেখতে পাবেন যে পদ্ধতি 1 এবং পদ্ধতি 2 আপনার নামের জায়গায় যুক্ত করা হয়েছে been আপনি কেবল পদ্ধতি 1 আমদানি করতে পারবেন না । আপনি হয় সেগুলি উভয়ই আমদানি করুন বা আপনি এগুলি মোটেও আমদানি করবেন না। পাইথনে আপনি কেবল আপনার পছন্দনীয় পদ্ধতি আমদানি করতে পারেন। এর যদি কোনও নাম থাকে তবে এটিকে বলা যেতে পারে নির্বাচনী আমদানি?


2
হ্যাঁ সঠিক! পাইথন নামের জায়গাগুলি পছন্দ করে। রুবির ক্ষেত্রেও কি তাই না? আপনি import bla; bla.foo()রুবি না ?
লেনার্ট রেজেব্রো

2
আপনি কেবলমাত্র ফাংশন এ আমদানি করতে পারবেন, সমস্ত ফাংশন ভিতরে নয়। উদাহরণস্বরূপ যদি আপনি এমন একটি রুবি মডিউল অন্তর্ভুক্ত করেন যা 3 টি অ স্থিত ফাংশন ঘোষণা করে তবে আপনি সেগুলি সমস্ত আপনার নামের জায়গায় অন্তর্ভুক্ত করবেন। পাইথনে আপনাকে মডিউল আমদানি থেকে লিখতে হবে *।
জিও

6
এর ফলে কি অনেকগুলি নেমস্পেসের কোলাহল হয় না?
লেনার্ট রেগেব্রো

1
আমি মনে করি এটি হয়। আমি রুবি মডিউল সম্পর্কে এটি ঘৃণা করি।
জিও

8
অজগরের মতো একই অর্থে রুবির কোনও মডিউল সিস্টেম নেই। মধ্যে বেকড dupilicate অন্তর্ভুক্তির জন্য কিছু চেক সঙ্গে পাঠগত অন্তর্ভুক্তি হিসাবে কাজ মূলত প্রয়োজন। আপনি নামব্যবধান হিসাবে (AB) ব্যবহারের মডিউল করতে পারেন কিন্তু moduleআসলে একটা আসল নয় একটি বিট হয়। মডিউলগুলি মূলত ক্লাস সং new, allocateপদ্ধতিগুলি। তারা প্রতি ক্লাস / অবজেক্ট ভিত্তিতে কোড ভাগ করে নেওয়ার উপায় হিসাবে, লাইব্রেরিগুলিকে বিভাজনের জন্য নয়, বা প্রোগ্রামগুলিতে কোড ভাগ করার জন্য সবচেয়ে ভাল কাজ করে।
লোগান ক্যাপাল্ডো

16

রুবির ওয়েবসাইট থেকে :

পাইথনের সাথে মিল, রুবিতে, ...

  • একটি ইন্টারেক্টিভ প্রম্পট রয়েছে (যার নাম আইআরবি)।
  • আপনি কমান্ড লাইনে ডকসগুলি পড়তে পারেন (পাইডোকের পরিবর্তে রি কমান্ড সহ)।
  • কোনও বিশেষ লাইন টার্মিনেটর নেই (সাধারণ নিউলাইন বাদে)।
  • স্ট্রিং লিটারালগুলি পাইথনের ট্রিপল-কোটেড স্ট্রিংয়ের মতো একাধিক লাইন বিস্তৃত করতে পারে।
  • বন্ধনীগুলি তালিকার জন্য, এবং ধনুর্বন্ধনী হ'ল ডিক্টের জন্য (যা রুবিতে, "হ্যাশ" নামে পরিচিত)।
  • অ্যারেগুলি একই কাজ করে (এগুলি যুক্ত করে একটি দীর্ঘ অ্যারে তৈরি করে তবে এগুলি এরকম রচনা করা a3 = [ a1, a2 ]আপনাকে অ্যারেগুলির একটি অ্যারে দেয়)।
  • অবজেক্টস দৃ strongly় এবং গতিশীল টাইপ করা হয়।
  • সবকিছুই একটি অবজেক্ট এবং ভেরিয়েবলগুলি কেবলমাত্র বস্তুর উল্লেখ।
  • কীওয়ার্ডগুলি কিছুটা আলাদা হলেও ব্যতিক্রমগুলি একই বিষয়ে কাজ করে।
  • আপনি এম্বেডড ডক সরঞ্জাম পেয়েছেন (রুবি'কে rdoc বলা হয়)।

পাইথনের মতো পার্থক্যগুলি, রুবিতে, ...

  • স্ট্রিংগুলি পরিবর্তনীয়।
  • আপনি ধ্রুবক তৈরি করতে পারেন (ভেরিয়েবলগুলি যার মান আপনি পরিবর্তন করতে চান না)।
  • কিছু প্রয়োগকৃত কেস-কনভেনশন রয়েছে (উদাহরণস্বরূপ শ্রেণীর নামগুলি বড় হাতের অক্ষর দিয়ে শুরু হয়, ভেরিয়েবলগুলি ছোট হাতের অক্ষর দিয়ে শুরু হয়)।
  • এখানে কেবলমাত্র এক ধরণের তালিকার ধারক রয়েছে (একটি অ্যারে) এবং এটি পরিবর্তনীয়।
  • ডাবল-কোটেড স্ট্রিংগুলি পালানোর সিকোয়েন্সগুলি (যেমন \ টি) এবং একটি বিশেষ "এক্সপ্রেশন বিকল্প" সিনট্যাক্সকে অনুমতি দেয় (যা আপনাকে রুবি এক্সপ্রেশনগুলির ফলাফলগুলি সরাসরি অন্য স্ট্রিংগুলিতে "+" স্ট্রিং "+" একসাথে যুক্ত না করে সন্নিবেশ করতে দেয়)) । একক-উদ্ধৃত স্ট্রিংগুলি পাইথনের আর "কাঁচা স্ট্রিং" এর মতো।
  • কোনও "নতুন স্টাইল" এবং "পুরানো স্টাইল" ক্লাস নেই। শুধু এক ধরণের।
  • আপনি সরাসরি বৈশিষ্ট্যে অ্যাক্সেস করেন না। রুবির সাথে, এটি সমস্ত পদ্ধতি কল।
  • পদ্ধতি কলগুলির জন্য প্রথম প্যারেন্টেসিসগুলি সাধারণত alচ্ছিক।
  • পাইথনের পরিবর্তে অ্যাক্সেস প্রয়োগের জন্য সরকারী, ব্যক্তিগত এবং সুরক্ষিত রয়েছে _voluntary_ underscore __convention__
  • "মিশিনস" একাধিক উত্তরাধিকারের পরিবর্তে ব্যবহৃত হয়।
  • আপনি অন্তর্নির্মিত ক্লাসগুলির পদ্ধতিগুলি যুক্ত বা সংশোধন করতে পারেন। উভয় ভাষা আপনাকে যে কোনও মুহুর্তে ক্লাসগুলি খুলতে এবং সংশোধন করতে দেয়, তবে পাইথন বিল্ট-ইনগুলিতে পরিবর্তন রোধ করে - রুবি তা করে না।
  • আপনি সত্য এবং মিথ্যা পরিবর্তে সত্য এবং মিথ্যা পেয়েছেন (এবং কারও পরিবর্তে শূন্য)।
  • যখন সত্যের জন্য পরীক্ষা করা হয়, কেবলমাত্র মিথ্যা এবং শূন্য একটি মিথ্যা মানকে মূল্যায়ন করে। বাকি সমস্ত কিছুই সত্য (০, ০.০, "" এবং [] সহ)।
  • এটি এলিফের পরিবর্তে এলসিফ।
  • এটি আমদানির পরিবর্তে প্রয়োজন। অন্যথায় যদিও, ব্যবহার একই।
  • উপরের জিনিসগুলিতে লাইন (গুলি) এর উপর সাধারণ স্টাইলের মন্তব্যগুলি (তাদের নীচে ডকাস্ট্রিংয়ের পরিবর্তে) ডক্স তৈরির জন্য ব্যবহৃত হয়।
  • এখানে অনেকগুলি শর্টকাট রয়েছে যা আপনাকে মনে রাখার মতো আরও বেশি দেয় তবে আপনি দ্রুত শিখতে পারেন। তারা রুবি মজাদার এবং খুব উত্পাদনশীল করার ঝোঁক।

2
"এটি আমদানির পরিবর্তে প্রয়োজন। অন্যথায়, ব্যবহার একই।" পুরোপুরি ভুল বলে মনে হচ্ছে।
গ্লেনজামিন

রুবিতে এমন সেগুলিও রয়েছে যা লোকেরা খুব কমই ব্যবহার করে তবে সেগুলি অন্তর্নির্মিত। তাই আমি বলতে পারি, স্টাফ_ইন_ব্যাকপ্যাক = সেট.নেইউ; স্টাফ_ইন_ব্যাকপ্যাক << "কম্পিউটার"; স্টাফ_ইন_ব্যাকপ্যাক << "জুতা"; # এবং সেটটি গ্যারান্টি ছাড়াই সমস্ত মানকে ধরে রাখবে।
জাচায়সান

12

পাইথনের উপরে রুবির যা আছে তা হ'ল এটির স্ক্রিপ্টিং ভাষার ক্ষমতা। শেল স্ক্রিপ্ট এবং সাধারণ পাঠ্য ম্যানিপুলেশনে "আঠালো কোড" ব্যবহার করার জন্য এই প্রসঙ্গে স্ক্রিপ্টিং ভাষা।

এগুলি বেশিরভাগ পার্লের সাথে ভাগ করা হয়। প্রথম শ্রেণীর অন্তর্নির্মিত নিয়মিত এক্সপ্রেশন, V-ভেরিয়েবলগুলি, দরকারী কমান্ড লাইন বিকল্পগুলির মতো পার্ল (-a, -e) ইত্যাদি

একসাথে এর ক্ষতচিহ্নের সাথে মহাকাব্যিক সিনট্যাক্স সহ এটি এই ধরণের কাজের জন্য উপযুক্ত।

আমার কাছে পাইথন হ'ল গতিসম্পন্ন টাইপ করা ব্যবসায়িক ভাষা যা শিখতে খুব সহজ এবং একটি ঝরঝরে বাক্য গঠন রয়েছে। রুবির মতো "শীতল" নয় বরং ঝরঝরে। পাইথন আমার কাছে রুবির উপরে যা কিছু রয়েছে তা হ'ল অন্যান্য স্তরের জন্য বাইন্ডিংয়ের বিশাল সংখ্যা। কিউটি এবং অন্যান্য জিইউআই লাইবস, অনেক গেম সাপোর্ট লাইব্রেরি এবং এবং। রুবির অনেক কম আছে। যদিও খুব বেশি ব্যবহৃত বাইন্ডিং যেমন ডাটাবেসগুলিতে ভাল মানের হয় আমি পাইথনে আরও কুলুঙ্গিগুলি আরও ভালভাবে সমর্থিত হতে পেলাম এমনকি একই লাইব্রেরির জন্য সেখানে রুবি বাইন্ডিং থাকলেও।

সুতরাং, আমি বলতে পারি যে উভয় ভাষারই এর ব্যবহার রয়েছে এবং এটি সেই কাজটি যা কোনটি ব্যবহার করবেন তা সংজ্ঞায়িত করে। উভয়ই শিখতে যথেষ্ট সহজ। আমি পাশাপাশি তাদের ব্যবহার। স্ক্রিপ্টিংয়ের জন্য রুবি এবং একক অ্যাপ্লিকেশনের জন্য পাইথন।


1
রুবি এখনও জানেন না এমন কারও কাছ থেকে প্রশ্ন: "V-ভেরিয়েবলস" বলতে কী বোঝ? আপনি কি গ্লোবাল ভেরিয়েবল বলতে চান? যদি তা হয় তবে পাইথনে, কোনও শ্রেণি বা ফাংশনের বাইরে মডিউলে একটি পরিবর্তনশীল সংজ্ঞায়িত হয়। যদি না - পার্থক্য কি?
আনন

1
আনন: আপনি কোডের যে কোনও জায়গায় $ পরিবর্তনশীল ঘোষণা করলে এটি উপসর্গের কারণে এটি বিশ্বব্যাপী। সুতরাং, এটি নির্ধারণ করা হয়েছে যেখানে এটি সর্বদা বৈশ্বিক এবং এটি সর্বদা হিসাবে পরিচিত হিসাবে কিছু যায় আসে না।
রবার্ট কে

8
ঠিক নয়, প্রকৃতপক্ষে আমি-_, $ 1 ইত্যাদির মতো প্রাক-সংজ্ঞায়িত ভেরিয়েবলগুলি বোঝাতে চাইছি matically $ _ হ'ল শেষ পংক্তি। Match 1, $ 2 ইত্যাদি শেষ ম্যাচের নিয়মিত প্রকাশের মিল। সম্পূর্ণ তালিকা জন্য এখানে দেখুন: zenspider.com/Languages/Ruby/QuickRef.html#17 এটি মূলত কমপ্যাক্ট স্ক্রিপ্টগুলির জন্য একটি হ্যাক। আপনি এপিআই কলগুলির মাধ্যমেও সমস্ত তথ্য পেতে পারেন তবে $ ভেরিয়েবলগুলি ব্যবহার করে এটি আরও ক্ষয় হয়। এই ধরণের ভেরিয়েবল কেবল পাইথনের স্টাইলের সাথে খাপ খায় না, তারা ইচ্ছাকৃতভাবে এগুলি ছেড়ে যায়।
হাফ্যাক্স

সেই জেনস্পাইডার লিঙ্কটির জন্য ধন্যবাদ - রুবির জন্য দ্রুত (টিউটোরিয়াল) অনুভূতির জন্য এমন কিছু সন্ধান করছিল।
আনন

12

আমি মনে করি না "রুবির এক্স আছে এবং পাইথন নেই, অন্যদিকে পাইথনের ওয়াই এবং রুবি নেই" এটি দেখার সবচেয়ে কার্যকর উপায়। এগুলি বেশ কয়েকটি ভাগ করে নেওয়ার ক্ষমতা সহ বেশ একই রকম ভাষা।

বৃহত্তর মাত্রায়, পার্থক্যটিই ভাষাটি মার্জিত এবং পাঠযোগ্য করে তোলে। আপনার উত্থাপিত উদাহরণটি ব্যবহার করার জন্য, উভয় তাত্ত্বিকভাবে ল্যাম্বডাস রয়েছে তবে পাইথন প্রোগ্রামাররা সেগুলি এড়িয়ে চলার প্রবণতা রাখে এবং এগুলি ব্যবহার করে তৈরি করা কাঠামোগুলি রুবির মতো পাঠযোগ্য বা অভিব্যক্তির কাছাকাছি আর দেখায় না। তাই পাইথন, একটি ভাল প্রোগ্রামার তিনি রুবি মধ্যে would চেয়ে সমস্যা সমাধানের একটি ভিন্ন রুট নিতে চাইবে, শুধুমাত্র এই কারণে এটা আসলে হয় এটা করতে ভাল উপায়।


5
আমি সম্মত হই যে ল্যাম্বডাসের সীমিত সুযোগ রয়েছে এবং অনেক ক্ষেত্রে এটি কার্যকর নয়। যাইহোক, পাইথন প্রোগ্রামাররা এটিকে প্লেগের মতো এড়িয়ে চলেন বলে আমার পক্ষে ন্যায়সঙ্গত বলে মনে হয় না।
জেসন বেকার

1
আমি সম্মত হই যে ল্যাম্বডাস প্রায়শই পাইথনের সাথে ব্যবহৃত হয় - যেমন মানচিত্র, ফিল্টার, হ্রাস সহ। বড় পার্থক্যটি মনে হচ্ছে পাইথন ল্যাম্বডাস কেবলমাত্র অভিব্যক্তিতে সীমাবদ্ধ যেখানে রুবি ব্লকগুলি বহুরেখা হতে পারে এবং বিবৃতি জড়িত করতে পারে। আমি রুবির সম্পর্কে যা পড়েছি তার থেকে আমার সাধারণ ধারণাটি হ'ল বিশেষত এই বৈশিষ্ট্যটি রুবিবাদীদের ডিএসএল পদ্ধতির দিকে যেতে বাধ্য করে, অন্যদিকে পাইথনিস্টাস এপিআই তৈরির ক্ষেত্রে বেশি সম্ভাবনা রাখে। যদিও রুবি সম্পর্কে আমার তথ্য এখনও খুব তুচ্ছ।
আনন

2
@ লেননার্ট: রুবিতে সারাক্ষণ মাল্টলাইন ব্লক ব্যবহার করা হয় - আমি প্রায়শই দেখি যে ল্যাম্বডাস আইডিয়োমেটিক পাইথন কোডে ব্যবহৃত হয়, বাস্তবে। একটি সাধারণ উদাহরণের জন্য, info.michael-simons.eu/2007/08/06/rails-mitted_to- স্মৃতি দেখুন
চক

1
@ লেনার্ট: না, এটি ফলন ব্যবহার করে না। (রুবির ফলন যাইহোক পাইথনের থেকে সম্পূর্ণ আলাদা - এটি কোনও জেনারেটর ফেরত দেয় না)) এটি লেখার অর্থবহ হবে না for format in respond_to()respond_toপদ্ধতি কিছু অর্থপূর্ণ ফেরত দেয় না - এটা কেবল বর্তমান HTTP অনুরোধ সাড়া। doমধ্যে respond_to doএকটি ব্লক শুরু হয়। সেই ব্লকে আমরা একটি অস্থায়ী অবজেক্টের সাথে কথা বলি ( formatএই উদাহরণে লেবেলযুক্ত ) যা এইচটিটিপি অনুরোধের প্রতিক্রিয়া জানাতে একটি খুব বেসিক ডিএসএল প্রয়োগ করে।
চক

3
আপনি কি জেনারেটরের বিপরীতে 'মিশ্রিত গণনা করতে' এবং তাত্ক্ষণিকভাবে 30 টি নতুন এবং বিস্ময়কর পুনরুদ্ধারক পেতে পারেন? ব্লক / প্রোকগুলি দুর্দান্ত কেন তা বোঝার আগে আপনাকে পুরো ভাষাটি দেখতে হবে।
পক্ষপাত

12

আমি মূল প্রশ্নের একটি বৈকল্পিক প্রস্তাব দিতে চাই, "রুবির কী আছে যে পাইথন নেই এবং বিপরীতে?" যা হতাশার জবাব স্বীকার করে, "আচ্ছা, আপনি রুবি বা পাইথন যেটি ইন্টারকালে করা যায় না তা দিয়ে আপনি কী করতে পারেন?" সেই স্তরের কিছুই নেই, কারণ পাইথন এবং রুবি দু'জনেই ট্যুরিং আনুমানিক হওয়ার সিংহাসনে বসে বিশাল রাজপরিবারের অংশ।

তবে এ সম্পর্কে কী:

পাইথনে কৃপণভাবে এবং ভালভাবে কী করা যায় যা রুবিতে এমন সৌন্দর্য এবং ভাল ইঞ্জিনিয়ারিং দিয়ে করা যায় না, বা বিপরীতে?

নিছক বৈশিষ্ট্যের তুলনায় এটি আরও আকর্ষণীয় হতে পারে।


সেরা মন্তব্য। এখনও আমার +1
নওফাল

11

পাইথনের তালিকা-উপলব্ধি এবং জেনারেটরের জন্য স্পষ্ট, বিল্টিন সিনট্যাক্স রয়েছে যেখানে রুবিতে আপনি মানচিত্র এবং কোড ব্লক ব্যবহার করবেন।

তুলনা করা

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

প্রতি

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

কীভাবে তালিকা বোধগম্যতা একটি সরল পাইথন নয় ? এবং পাইথনের পাশাপাশি একটি মানচিত্রের ফাংশন রয়েছে।
সাইলেন্টগোস্ট

তবে রুবিতে কোনও তালিকা বোঝার বাক্য গঠন নেই
ডারিও

পাইথন: রেস = মানচিত্র (ল্যাম্বদা এক্স: এক্স * এক্স, রেঞ্জ (1,10))
গোগা রিজার

পাইথন:res=map(2 .__rpow__, range(1,10))
জন লা রোয়

11

"বড় বড় অক্ষর দিয়ে শুরু হওয়া পরিবর্তনগুলি স্থির হয়ে যায় এবং পরিবর্তন করা যায় না"

ভুল। তারা পারে.

আপনি যদি করেন তবেই আপনি একটি সতর্কতা পাবেন।


2
যদি কোনও ভাষা আপনাকে কোনও অপারেশনের জন্য একটি সতর্কতা দেয় তবে আমার অভিমত যে আপনি খুব ভালভাবে অপারেশনটিকে "সম্ভব নয়" বিবেচনা করতে পারেন। আর কিছু হ'ল উন্মাদনা।
পোরগারমিংডুড

11

অবকাঠামোগত দিক থেকে কিছুটা:

  • পাইথনের সি ++ ( বুস্ট. পাইথন , এসআইপি এর মতো জিনিসগুলির মাধ্যমে) এর সাথে আরও ভাল সংহতকরণ রয়েছে , এবং পাই ++ এর ) রুবির তুলনায় , যেখানে বিকল্পগুলি রুবি ইন্টারপ্রেটার এপিআইয়ের বিরুদ্ধে সরাসরি লিখতে পারে বলে মনে হয় (যা আপনি পাইথনের সাথে করতে পারেন অবশ্যই, তবে উভয় ক্ষেত্রেই নিম্ন স্তরের, ক্লান্তিকর, এবং ত্রুটির প্রবণতাযুক্ত) বা এসডিজিআইজি ব্যবহার করুন (যা এটি কাজ করে এবং স্পষ্টতই দুর্দান্ত যদি আপনি অনেকগুলি ভাষা সমর্থন করতে চান তবে বুস্ট.পাইথন বা এসআইপি যতটা সুন্দর তা নয়) আপনি বিশেষত সি ++ বাঁধতে চাইছেন)।

  • পাইথনের বেশ কয়েকটি ওয়েব অ্যাপ্লিকেশন পরিবেশ রয়েছে (জ্যাঙ্গো, পাইলন্স / টার্বোগারস, ওয়েব.পি, সম্ভবত কমপক্ষে অর্ধ ডজন অন্যান্য), অন্যদিকে রুবির একটি রয়েছে: রেলগুলি। (অন্যান্য রুবি ওয়েব ফ্রেমওয়ার্কগুলির উপস্থিতি রয়েছে, তবে আপাতদৃষ্টিতে রেলগুলির বিরুদ্ধে খুব বেশি আকর্ষণীয় হতে পারে)। এই দিকটি ভাল না খারাপ? বলা শক্ত, এবং সম্ভবত বেশ সাবজেক্টিভ; আমি খুব সহজেই যুক্তিগুলি কল্পনা করতে পারি যে পাইথনের পরিস্থিতি আরও ভাল এবং রুবির পরিস্থিতি আরও ভাল।

  • সাংস্কৃতিকভাবে পাইথন এবং রুবি সম্প্রদায়গুলি কিছুটা আলাদা বলে মনে হয় তবে রুবি সম্প্রদায়ের সাথে মতবিনিময় করার মতো অভিজ্ঞতা আমার নেই বলে আমি কেবল এটিই ইঙ্গিত করতে পারি। আমি এটি মূলত এই আশায় যুক্ত করছি যে যার দুজনের সাথে প্রচুর অভিজ্ঞতা আছে তিনি এই বিবৃতিটি প্রশস্ত করতে (বা প্রত্যাখ্যান) করতে পারেন।


7
আপনার দ্বিতীয় পয়েন্টটি সেরাভাবে ভুল তথ্য দেওয়া আছে। আপনার র্যাক এবং সিনেট্রা
ম্যাক্স ওগডেন

6
আমি স্পষ্টভাবে নোট করি যে অন্যান্য রেল স্ট্যাকের উপস্থিতি রয়েছে; আমি শুধু মনে করি না যে কেউ আসলে তাদের ব্যবহার করছে। সিনাট্রা এবং র্যাক চেক করা ঠিক সেই ছাপটি বদলেনি। আপনি কি সত্যিই ভাবেন, বলুন, সিনাত্রা (৯৯ টি এসও প্রশ্নে মোট প্রশ্ন), বা ক্যাম্পিং (মোট দুটি এসও প্রশ্ন), বা অন্য যে কোনও একটির প্রকৃত ইউজারবেস / সম্প্রদায় রয়েছে? তাদের বেশিরভাগেরই বাস্তব জীবনের ব্যবহারকারী নেই, যতদূর আমি বলতে পারি। জ্যাঙ্গো (4 কে +) বা রেলস (7 কে +), বা এমনকি ওয়েব.পি এর সাথে তুলনা করুন।
জ্যাক লয়েড

1
সিনাত্রা তার ডিএসএল এর কারণে বিভিন্ন, লাইটওয়েট কাজের জন্য আসলে বরং জনপ্রিয়। এটি কেবলমাত্র কম ব্যবহৃত হয়েছে কারণ রেলের এমভিসি আরও সরবরাহ করে। রেলগুলি আসলে রকের উপর নির্মিত - এটি ফিউশন যাত্রীটিকে সম্ভব করে তোলে।
বিকল্প

11

নির্লজ্জভাবে কপি / আটকানো থেকে: কমপ্যাং.প্যাথথথন মেলিং তালিকা থেকে " পাইথনের চেয়ে রুবির সম্পর্কে আরও ভাল কি " এলেক্স মার্টেলির উত্তর answer

আগস্ট 18 2003, 10:50 am এরিক ম্যাক্স ফ্রান্সিস লিখেছেন:

"ব্র্যান্ডন জে ভ্যান প্রতিটি" লিখেছেন:

পাইথনের চেয়ে রুবি সম্পর্কে আরও ভাল কি? আমি নিশ্চিত কিছু আছে। এটা কি?

পাইথনের লোকদের চেয়ে রুবি মানুষকে এটি জিজ্ঞাসা করা কি আরও বেশি অর্থবোধ করে না?

কারও উদ্দেশ্যগুলির উপর নির্ভর করে হতে পারে, বা নাও পারে - উদাহরণস্বরূপ, যদি কারও উদ্দেশ্যগুলিতে পাইথন সম্প্রদায়ের "সমাজতাত্ত্বিক অধ্যয়ন" অন্তর্ভুক্ত থাকে, তবে সেই সম্প্রদায়কে প্রশ্ন করা অন্য কোথাও রাখার চেয়ে এ সম্পর্কিত তথ্যের আরও প্রকাশিত প্রমাণ হতে পারে :-)।

ব্যক্তিগতভাবে, আমি আনন্দের সাথে শেষ ওএসকনে ডেভি টমাসের একদিনের রুবি টিউটোরিয়ালটি অনুসরণ করার সুযোগটি গ্রহণ করেছি। সিনট্যাক্স পার্থক্যের একটি পাতলা পাতলা নীচে, আমি রুবি এবং পাইথনকে আশ্চর্যজনকভাবে দেখতে পেয়েছি - যদি আমি প্রায় কোনও ভাষার মধ্যে ন্যূনতম বিস্তৃত গাছটি গণনা করছিলাম তবে আমি নিশ্চিত যে পাইথন এবং রুবি একত্রিত হওয়ার প্রথম দুটি পাতা হবে একটি মধ্যবর্তী নোড :-)।

অবশ্যই, আমি প্রতিটি ব্লকের শেষে নিখুঁত "প্রান্ত" টাইপ করার ক্ষেত্রে রুবিতে ক্লান্ত হয়ে পড়েছি (কেবল বিনা অনর্থক) - তবে তারপরে আমি সমান-মূর্খ ':' টাইপ করা এড়াতে পারি যা পাইথনের জন্য প্রয়োজনীয় শুরু প্রতিটি ব্লক, তাই প্রায় এক ধোয়ার যে :-)। অন্যান্য সিনট্যাক্স পার্থক্য যেমন '@ ফু' বনাম 'সেলফুফু', বা রুবি বনাম পাইথনের মামলার উচ্চতর তাত্পর্য আমার কাছে প্রায় অপ্রাসঙ্গিক।

নিঃসন্দেহে অন্যরা প্রোগ্রামিং ভাষার তাদের পছন্দগুলি কেবলমাত্র এই জাতীয় ভিত্তিতেই ভিত্তি করে এবং এগুলি সবচেয়ে বিতর্কিত বিতর্ক তৈরি করে - তবে আমার কাছে এটি পার্কিনসনের আইন প্রয়োগের একটি মাত্র উদাহরণ (কোনও ইস্যুতে বিতর্কের পরিমাণ ইস্যুটির বিপরীতভাবে সমানুপাতিক প্রকৃত গুরুত্ব)।

সম্পাদন করা (এএম 6/19/2010 11:45 দ্বারা): এটি "বাইকশেড পেইন্টিং" (বা সংক্ষেপে, "বাইকশেডিং") নামেও পরিচিত - রেফারেন্সটি আবার নর্থকোট পার্কিনসনের, যিনি "বিতর্ক করেছিলেন" "তুচ্ছ বিষয়গুলির উপর গরম বিতর্ক" এর একটি আদর্শ উদাহরণ হিসাবে বাইকশেডটি কী রঙে রঙ করবেন to (শেষ অফ সম্পাদনা)।

একটি সিনট্যাক্স পার্থক্য যা আমি গুরুত্বপূর্ণ মনে করি এবং পাইথনের পক্ষে - তবে অন্যান্য লোকেরা অবশ্যই সন্দেহ করবে যে এটির বিপরীত - এটি "আপনি কোনও ফাংশনটিকে কীভাবে কল করবেন যা কোনও পরামিতি নেয় না" is পাইথনে (সি এর মতো) কোনও ফাংশন কল করার জন্য আপনি সর্বদা "কল অপারেটর" প্রয়োগ করেন - আপনি যে বস্তুটি কল করছেন তার ঠিক পিছনে প্যারেন্টিজেসগুলি (tra পিছনের বন্ধনীগুলির মধ্যে আপনি কলটি যাচ্ছেন সেই অর্গগুলি যান) যদি আপনি কোনও অর্গ পাস করছেন না, তবে প্রথম বন্ধনী খালি আছে)। এটি নিছক উল্লেখ রেখে যায় কোনঅবজেক্ট, কোনও অপারেটর জড়িত না হিসাবে অর্থটির অর্থ কেবলমাত্র একটি রেফারেন্স - কোনও প্রসঙ্গে, বিশেষ ক্ষেত্রে ব্যতিক্রম ছাড়া, অ্যাড-হক নিয়ম এবং এর মতো। রুবিতে (পাস্কেলের মতো), আপনি আর্গুমেন্টগুলি দিয়ে একটি ফাংশন কল করার জন্য আর্গুমেন্টগুলি দিয়ে পাস করেন (সাধারণত প্যারেন্টেসিসে, যদিও এটি প্রায়শই হয় না) - তবে যদি ফাংশনটি কোনও অর্গ না নেয় তবে কেবল ফাংশনটির উল্লেখ কেবল স্পষ্টভাবে বলা হয়। এটি অনেক লোকের প্রত্যাশা পূরণ করতে পারে (কমপক্ষে সন্দেহ নেই, যাদের প্রোগ্রামিংয়ের পূর্ববর্তী অভিজ্ঞতা কেবল পাস্কালের সাথে ছিল, বা অন্যান্য ভাষাগুলির সাথে অনুরূপ "অন্তর্নিহিত কলিং" যেমন ভিজুয়াল বেসিক) - তবে আমার কাছে এটির অর্থ কেবলমাত্র কোনও সামগ্রীর উল্লেখের অর্থ হ'ল বস্তুর একটি রেফারেন্স, বা বস্তুর প্রকারের উপর নির্ভর করে অবজেক্টের কাছে কোনও কল - এবং সেই ক্ষেত্রে যেখানে আমি পারি ' কেবলমাত্র উল্লেখ করে অবজেক্টের কোনও রেফারেন্স পাবেন না আমাকে স্পষ্টভাবে ব্যবহার করতে হবে "আমাকে এ সম্পর্কে একটি রেফারেন্স দিন, এটি কল করবেন না!" অপারেটরগুলির যা অন্যথায় প্রয়োজন হয় না। আমি এটি ফাংশনগুলির "প্রথম শ্রেণীরতা" (বা পদ্ধতিগুলি বা কলযোগ্য বস্তু) এবং সহজেই অবজেক্টগুলি বিনিময় করার সম্ভাবনাটিকে প্রভাবিত করি বলে আমি মনে করি। অতএব, আমার কাছে, এই নির্দিষ্ট বাক্য গঠন পার্থক্যটি রুবির বিরুদ্ধে মারাত্মক কালো চিহ্ন - তবে আমি বুঝতে পারি যে অন্যরা কেন অন্যথায় বিষয়টি করবে, যদিও আমি তাদের সাথে খুব দৃhe়তার সাথে একমত হতে পারি না :-)। ফাংশন (বা পদ্ধতিগুলি, বা অন্যান্য কলযোগ্য বস্তু) এবং সহজেই অবজেক্টগুলি বিনিময় করার সম্ভাবনা। অতএব, আমার কাছে, এই নির্দিষ্ট বাক্য গঠন পার্থক্যটি রুবির বিরুদ্ধে মারাত্মক কালো চিহ্ন - তবে আমি বুঝতে পারি যে অন্যরা কেন অন্যথায় বিষয়টি করবে, যদিও আমি তাদের সাথে খুব দৃhe়তার সাথে একমত হতে পারি না :-)। ফাংশন (বা পদ্ধতিগুলি, বা অন্যান্য কলযোগ্য বস্তু) এবং সহজেই অবজেক্টগুলি বিনিময় করার সম্ভাবনা। অতএব, আমার কাছে, এই নির্দিষ্ট বাক্য গঠন পার্থক্যটি রুবির বিরুদ্ধে মারাত্মক কালো চিহ্ন - তবে আমি বুঝতে পারি যে অন্যরা কেন অন্যথায় বিষয়টি করবে, যদিও আমি তাদের সাথে খুব দৃhe়তার সাথে একমত হতে পারি না :-)।

বাক্য গঠন নীচে, আমরা প্রাথমিক শব্দার্থবিজ্ঞানের কিছু গুরুত্বপূর্ণ পার্থক্য পেতে পারি - উদাহরণস্বরূপ, রুবির স্ট্রিংগুলি পারস্পরিক পরিবর্তনযোগ্য বস্তু (যেমন সি ++ এর মতো), পাইথনগুলিতে সেগুলি পরিবর্তনযোগ্য নয় (যেমন জাভাতে বা আমি বিশ্বাস করি সি #)। আবার, লোকেরা যাঁরা ইতিমধ্যে পরিচিত তাদের সাথে প্রাথমিকভাবে বিচার করে তারা রুবীর জন্য এটি একটি প্লাস বলে মনে করতে পারে (যদি না তারা জাভা বা সি # এর সাথে পরিচিত না হন তবে অবশ্যই :-)। আমি, আমি মনে করি অপরিবর্তনীয় স্ট্রিংগুলি একটি দুর্দান্ত ধারণা (এবং আমি অবাক হইনি যে জাভা, স্বাধীনভাবে আমি মনে করি যে ধারণাটি পুনরুদ্ধার করেছেন যা ইতিমধ্যে পাইথনে ছিল), যদিও আমি "পরিবর্তনীয় স্ট্রিং বাফার" টাইপটিও পোষণ করব না would (এবং জাভা এর নিজস্ব "স্ট্রিং বাফার" এর চেয়ে সহজেই ব্যবহারের সুবিধাসহ এক); এবং আমি পরিচিতির কারণে এই রায় দিচ্ছি না - জাভা অধ্যয়নের আগে, সমস্ত ডেটা অপরিবর্তনীয়, আমি যে সমস্ত ভাষাগুলি জানতাম তার মধ্যে পরিবর্তনীয় স্ট্রিং ছিল - তবুও আমি যখন প্রথম জাভাতে অপরিবর্তনীয় স্ট্রিং আইডিয়াটি দেখেছিলাম (যা আমি পাইথন শিখার আগে আমি ভালভাবে শিখেছিলাম) তখনই এটি আমাকে তাত্ক্ষণিকভাবে চমকে দিয়েছে, এটি খুব ভাল ফিট একটি উচ্চ স্তরের প্রোগ্রামিং ভাষার রেফারেন্স-শব্দার্থবিজ্ঞানের (মেশিনের কাছাকাছি ভাষা এবং অ্যাপ্লিকেশন থেকে আরও বেশি সুনির্দিষ্ট ভাষাগুলির সাথে সবচেয়ে ভাল যে মান-শব্দার্থবিরোধী তার বিপরীতে) প্রথম শ্রেণীর অন্তর্নির্মিত (এবং সুন্দর) গুরুত্বপূর্ণ) ডেটা টাইপ।

প্রাথমিক অর্থশাস্ত্রের ক্ষেত্রে রুবির কিছু সুবিধা রয়েছে - উদাহরণস্বরূপ, পাইথনের "তালিকাগুলি বনাম টিউপলস" অপসারণের অতি সূক্ষ্ম পার্থক্য অপসারণ। তবে বেশিরভাগ স্কোর (যেমন আমি এটি রেখেছি, সরলতার সাথে একটি বড় প্লাস এবং সূক্ষ্মভাবে, চতুর পার্থক্যগুলি একটি উল্লেখযোগ্য বিয়োগ), রুবির বিপক্ষে (যেমন, বন্ধ এবং অর্ধ-খোলা বিরতি উভয়ই থাকাকালীন a..b এবং a .. .b [যে কেউ দাবি করতে চায় যে এটি স্পষ্ট যা কোনটি? -)] নির্বোধ - আইএমএইচও, অবশ্যই!)। আবার, যে লোকেরা একটি মিনাসের পরিবর্তে কোনও প্লাসের মূল অংশে অনেকগুলি অনুরূপ তবে সূক্ষ্মভাবে বিভিন্ন জিনিস রাখার বিষয়টি বিবেচনা করে তারা অবশ্যই আমি তাদের কীভাবে গণনা করব :-) থেকে এগুলি "অন্যান্য উপায়ে" গণনা করব।

এই ভাষাগুলি দু'টি ভাষা ভেবে ভেবে ভুল করবেন না খুবআলাদা, মনে আছে। তারা না। তবে যদি আমাকে "কেপেলি ডি'জেলো" এর সাথে "স্প্যাগেটিনি" তুলনা করতে বলা হয়, এই দুই প্রকারের পাস্তা যে কারও কাছেই কেবল অবিচ্ছেদ্য এবং যে কোনও খাবারের জন্য আপনি প্রস্তুত করতে চান তা বিনিময়যোগ্য বলে উল্লেখ করার পরে, আমি অবশ্যই অনিবার্যভাবে দৈর্ঘ্য এবং ব্যাসারকগুলি কীভাবে অবিচ্ছিন্নভাবে পৃথক হয়, কীভাবে প্রান্তগুলির প্রান্তটি এক ক্ষেত্রে টেপার করা হয় এবং অন্য ক্ষেত্রে হয় না - এবং কেন আমি ব্যক্তিগতভাবে, বরং ক্যাপেলি ডি করানোর চেষ্টা করব এবং তা ব্যাখ্যা করার জন্য 'অ্যাঞ্জেলো কোনও প্রকারের ঝোলের পাস্তা হিসাবে, তবে স্প্যাসেটিটিনি পছন্দ করবে যেমন পাতাসিচুত্তা হিসাবে দীর্ঘ লম্বা পাতলা পাস্তা ফর্মগুলির জন্য উপযুক্ত সস (জলপাই তেল, কাঁচা রসুন, কাঁচা লাল মরিচ এবং সূক্ষ্ম গ্রাউন্ড অ্যাঙ্কোভিস, উদাহরণস্বরূপ - তবে আপনি যদি রসুন এবং মরিচগুলি কাটা কাটার পরিবর্তে টুকরো টুকরো করে ফেলেছেন তবে স্প্যাগেটির স্নিগ্ধর পরিবর্তে আপনার স্প্যাগেটির শব্দযুক্ত দেহটি বেছে নেওয়া উচিত এবং ভালভাবে অ্যাচোভিজকে পূর্বাভাস দেওয়া এবং পরিবর্তে কিছু টাটকা বসন্ত তুলসী যুক্ত করার পরামর্শ দেওয়া হবে [ বা এমনকি - আমি একজন ধার্মিক ...! - হালকা পুদিনা ...] পাতা - ডিশ পরিবেশন করার আগে একেবারে শেষ মুহুর্তে)। ওফস, দুঃখিত, এটি দেখায় যে আমি বিদেশ ভ্রমণ করছি এবং কিছুক্ষণের জন্য পাস্তাও করিনি। তবে সাদৃশ্যটি এখনও বেশ ভাল! -) - হালকা পুদিনা ...] পাতা - ডিশ পরিবেশন করার আগে একেবারে শেষ মুহুর্তে)। ওফস, দুঃখিত, এটি দেখায় যে আমি বিদেশ ভ্রমণ করছি এবং কিছুক্ষণের জন্য পাস্তাও করিনি। তবে সাদৃশ্যটি এখনও বেশ ভাল! -) - হালকা পুদিনা ...] পাতা - ডিশ পরিবেশন করার আগে একেবারে শেষ মুহুর্তে)। ওফস, দুঃখিত, এটি দেখায় যে আমি বিদেশ ভ্রমণ করছি এবং কিছুক্ষণের জন্য পাস্তাও করিনি। তবে সাদৃশ্যটি এখনও বেশ ভাল! -)

সুতরাং, পাইথন এবং রুবিতে ফিরে আমরা দুটি বিগির কাছে এসেছি (ভাষার যথাযথ বিবেচনায় - গ্রন্থাগারগুলি রেখে, এবং অন্যান্য গুরুত্বপূর্ণ উপকরণ যেমন সরঞ্জাম এবং পরিবেশ, প্রতিটি ভাষা কীভাবে এম্বেড / প্রসারিত করা যায় ইত্যাদি ইত্যাদি) এটি আপাতত - তারা যে কোনওভাবেই প্রতিটি ভাষার সমস্ত প্রয়োগের জন্য আবেদন করবে না, যেমন, জাইথন ​​বনাম ক্লাসিক পাইথন পাইথন ভাষার দুটি বাস্তবায়ন!):

  1. রুবির পুনরুক্তিকারী এবং কোডব্লক বনাম পাইথনের পুনরুক্তি এবং জেনারেটর;

  2. রুবির মোট, নিরবিচ্ছিন্ন "গতিশীলতা", যা
    অন্তর্নির্মিত সকল সহ যে কোনও বিদ্যমান শ্রেণীর "পুনরায় খোলা" করার ক্ষমতা এবং রান-টাইমে এর আচরণ পরিবর্তন করতে সক্ষম - বনাম পাইথনের বিস্তৃত তবে সীমিত গতিশীলতা, যা কখনই বিদ্যমান আচরণের পরিবর্তন করে না অন্তর্নির্মিত ক্লাস এবং তাদের দৃষ্টান্তগুলি।

ব্যক্তিগতভাবে, আমি 1 ওয়াশ বিবেচনা করি (পার্থক্যগুলি এতটাই গভীর যে আমি সহজেই লোককে ঘৃণা করতে দেখি এবং অন্যটিকে আবার ঘুরিয়ে দিতে দেখি, তবে আমার ব্যক্তিগত স্কেলগুলিতে প্লাসগুলি এবং বিয়োগগুলি এমনকি প্রায় আপ পর্যন্ত বেড়ে যায়); এবং 2 একটি গুরুত্বপূর্ণ সমস্যা - এটি রুবিকে "টিঙ্কারিং" করার জন্য অনেক বেশি উপযোগী করে তোলে, তবে পাইথন বৃহত্তর উত্পাদন অ্যাপ্লিকেশনগুলিতে ব্যবহারের জন্য সমানভাবে আরও উপযুক্ত। এটি একরকম মজার বিষয়, কারণ উভয় ভাষাই বেশিরভাগের চেয়ে অনেক বেশি গতিশীল, কারণ শেষ পর্যন্ত আমার পিওভি থেকে তাদের মধ্যে মূল পার্থক্যটি এটির উপর নির্ভর করে - যে রুবি এই বিষয়ে "এগারোটিতে যায়" (রেফারেন্স) অবশ্যই এটি "স্পাইনাল ট্যাপ" করতে হবে)। রুবিতে,আমি এটা করতে পারি ! অর্থাৎ, আমি গতিশীলভাবে অন্তর্নির্মিত স্ট্রিং ক্লাসটি পরিবর্তন করতে পারি যাতে একটি = "হ্যালো ওয়ার্ল্ড" বি = "হ্যালো ওয়ার্ল্ড" যদি একটি == বি প্রিন্ট "সমান! Print n" অন্যটি প্রিন্ট করুন "আলাদা! End n" শেষ হবে উইল প্রিন্ট " সমান". অজগরটিতে, আমি এটি করতে পারি এমন কোনও উপায় নেই। রূপান্তরকরণ, পরীক্ষামূলক কাঠামো বাস্তবায়ন এবং এর মতো উদ্দেশ্যে, রুবির এই আশ্চর্যজনক গতিশীল দক্ষতা অত্যন্ত মর্মস্পর্শী। তবে - যদি আমরা বড় বড় অ্যাপ্লিকেশনগুলির বিষয়ে কথা বলি যা বহু লোক দ্বারা বিকাশিত হয় এবং বিভিন্ন উত্স থেকে সমস্ত ধরণের লাইব্রেরি সহ আরও অনেকগুলি দ্বারা রক্ষণাবেক্ষণ করা হয় এবং ক্লায়েন্ট সাইটে প্রোডাকশনে যাওয়ার প্রয়োজন হয় ... ভাল, আমি চাই না এমন একটি ভাষা যা কোয়েট এত গতিশীল, আপনাকে অনেক ধন্যবাদ। আমি কিছু লাইব্রেরিকে অজান্তেই অন্যান্য সম্পর্কহীনদের ভেঙে ফেলার যে ধারণাটি ঘৃণা করি তা ঘৃণা করি যে এই স্ট্রিংগুলি পৃথক হওয়ার উপর নির্ভর করে - এই ধরণের গভীর এবং গভীরভাবে লুকানো "চ্যানেল", কোডের টুকরোগুলির মধ্যে যা দেখতে আলাদা এবং আলাদা হওয়া উচিত, যা মৃত্যুর বানান করে বড় আকারের প্রোগ্রামিং। কোনও মডিউল অন্য কোনও "গোপনে" আচরণের উপর প্রভাব ফেলতে দিয়ে, অন্তর্নির্মিত ধরণের শব্দার্থকগুলিকে রূপান্তর করার ক্ষমতা উত্পাদন অ্যাপ্লিকেশন প্রোগ্রামিংয়ের জন্য কেবল একটি BAD ধারণা,

যদি আমাকে এত বড় অ্যাপ্লিকেশনের জন্য রুবি ব্যবহার করতে হয়, আমি কোডিং-স্টাইল বিধিনিষেধ, প্রচুর পরীক্ষার উপর নির্ভর করতে চেষ্টা করতাম (যখনই কোনও পরিবর্তন হয় তখনই পুনরায় চালিত হতে হবে - এমনকি যা সম্পূর্ণ সম্পর্কযুক্ত নয় ...) এবং এর মতো, এই ভাষার বৈশিষ্ট্যটির ব্যবহার নিষিদ্ধ করতে। তবে আমার মতে বৈশিষ্ট্যটি প্রথম স্থানে না রাখা আরও ভাল, যেমনটি পাইথন নিজেই অ্যাপ্লিকেশন প্রোগ্রামিংয়ের জন্য আরও ভাল ভাষা হতে পারে যদি নির্দিষ্ট সংখ্যক বিল্ট-ইনগুলি "পেরেক চেপে ধরে" রাখতে পারে, তবে আমি জানলাম যে উদাহরণস্বরূপ, লেন ("সিওও") হ'ল 4 ( বিল্টিনস মডিউলে কেউ 'লেন' নামের বাঁধাই বদলেছে কিনা তা নিয়ে স্পষ্টভাবে চিন্তা করার চেয়ে ...)। আমি আশা করি যে শেষ পর্যন্ত পাইথন তার বিল্ট-ইনগুলি "পেরেক ডাউন" করবে।

তবে সমস্যাটি নাবালক, যেহেতু বিল্ট-ইনগুলি রিবাডিং করা একেবারে অবহেলিত পাশাপাশি পাইথনের বিরল অনুশীলন। রুবিতে, এটি আমাকে প্রধান হিসাবে আঘাত করে - ঠিক যেমনটি অন্যান্য ভাষার খুব শক্তিশালী ম্যাক্রো সুবিধার মতো (যেমন, ডিলান) আমার নিজের মতামতগুলিতে একই রকম ঝুঁকি উপস্থিত করে (আমি আশা করি যে পাইথন কখনও এ জাতীয় শক্তিশালী ম্যাক্রো সিস্টেম পায় না, না "লোকেরা তাদের নিজস্ব ডোমেন-নির্দিষ্ট ছোট্ট ভাষাগুলিকেই নিজের ভাষায় এম্বেড করার অনুমতি দেয়" - এর প্রলোভনের বিষয়টি বিবেচনা করে - এটি আইএমএইচও, অ্যাপ্লিকেশন প্রোগ্রামিংয়ের জন্য পাইথনের বিস্ময়কর কার্যকারিতা ক্ষতিগ্রস্থ করবে, যিনি এই টিনকিয়ারকে "আকর্ষণীয় উপদ্রব" উপস্থাপন করে প্রতিটি প্রোগ্রামারের হৃদয়ে লুকিয়ে থাকে ...)।

অ্যালেক্স


9

অন্যদের থেকে:

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

(যদি আমি পৃষ্ঠাটি আপডেট হওয়ার পরে রুবীর দিক থেকে কোনও কিছুর ভুল ব্যাখ্যা দিয়ে থাকে বা এর কোনও পরিবর্তন হয়ে থাকে তবে কেউ সম্পাদনা করতে দ্বিধা বোধ করবেন ...)

স্ট্রিংগুলি রুবিতে পরিবর্তিত হয়, পাইথনে নয় (যেখানে নতুন পরিবর্তনগুলি "পরিবর্তন" দ্বারা তৈরি করা হয়)।

রুবির কিছু বলপূর্বক কেস কনভেনশন রয়েছে, পাইথন তা করে না।

পাইথনের দুটি তালিকা এবং টিপলস (অপরিবর্তনীয় তালিকা) রয়েছে। রুবিতে পাইথন তালিকার সাথে সম্পর্কিত অ্যারে রয়েছে তবে সেগুলির কোনও পরিবর্তনীয় রূপ নেই।

পাইথনে, আপনি সরাসরি অবজেক্ট বৈশিষ্ট্য অ্যাক্সেস করতে পারেন। রুবিতে, এটি সর্বদা পদ্ধতিগুলির মাধ্যমে।

রুবিতে, পদ্ধতি কলগুলির জন্য প্রথম বন্ধনী সাধারণত alচ্ছিক হয় তবে পাইথনে নয়।

পাইথনের আন্ডারস্কোর এবং নাম ম্যাঙ্গালিংয়ের কনভেনশন পরিবর্তে রুবির অ্যাক্সেস প্রয়োগের জন্য সরকারী, ব্যক্তিগত এবং সুরক্ষিত রয়েছে।

পাইথনের একাধিক উত্তরাধিকার রয়েছে। রুবিতে "মিক্সিনস" রয়েছে।

এবং অন্য খুব প্রাসঙ্গিক লিঙ্ক:

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

যা, বিশেষত, অ্যালেক্স মার্তেলির আরও একটি ভালকে লিঙ্ক করেছে , যিনি এসওতে এখানে প্রচুর দুর্দান্ত জিনিস পোস্ট করেছেন:

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


1
রুবিতে আপনি সহজেই আপনার অ্যারেটিকে পরিবর্তনযোগ্য কিছুতে পরিবর্তন করতে ব্যবহার করতে পারেন
ব্যবহারকারী ১63৩৩65


8

আমি এ সম্পর্কে অনিশ্চিত, তাই আমি এটি প্রথমে একটি উত্তর হিসাবে যুক্ত করি।

পাইথন আনবাউন্ড পদ্ধতিগুলি ফাংশন হিসাবে বিবেচনা করে

এর অর্থ আপনি কোনও পদ্ধতিটিকে পছন্দ মতো theobject.themethod()বা কল করতে পারেন TheClass.themethod(anobject)

সম্পাদনা: যদিও পাইথন এবং পদ্ধতিতে ফাংশনগুলির মধ্যে পার্থক্যটি অল্প, এবং পাইথন 3-তে অ-অস্তিত্বশীল, এটি রুবিতেও নেই, কেবল কারণ রুবির কার্যকারিতা নেই। আপনি যখন কার্যগুলি সংজ্ঞায়িত করেন, আপনি আসলে অবজেক্টে পদ্ধতিগুলি সংজ্ঞায়িত করছেন are

তবে আপনি এখনও একটি শ্রেণির পদ্ধতি গ্রহণ করতে পারেন না এবং এটি একটি ফাংশন হিসাবে কল করতে পারেন না, আপনাকে যে বস্তুটির উপরে কল করতে চান তাতে এটি পুনরায় ফিরিয়ে দিতে হবে, যা আরও বেশি বাধা।


রুবির মোটেও ফাংশন নেই। বলেছিল, TheClass.instance_method(:themethod).bind(anobject).callসমান রুবি হবে।
লোগান ক্যাপাল্ডো

উহু. সুতরাং সেখানে কোনও ধরণের যাদু মেইন ক্লাস থাকে যখন আপনি কোনও ফাংশন সংজ্ঞায়িত করেন যা একটি স্পষ্ট ক্লাসে নেই?
লেনার্ট রেগেব্রো

হ্যাঁ, শীর্ষ স্তরে সংজ্ঞায়িত পদ্ধতিগুলি হ'ল ব্যক্তিগত পদ্ধতি Object
লোগান ক্যাপাল্ডো

1
এফডাব্লুআইডাব্লু, মনে হয় পাইথনে, ফাংশন এবং পদ্ধতিগুলি আসলে একই ধরণের, এবং তাদের ভিন্ন আচরণ বর্ণনাকারীদের থেকে আসে: ইউজার.সিআরএন । / পিথন / ডাউনলোড /
বাস্তিয়ান লোনার্ড

1
তবে আপনি যদি এটি কোনও বস্তুর সাথে আবদ্ধ করেন, তবে এটি আনবাউন্ড নয়। Duh। :-) এবং পাইথনগুলিতেও তারা একই জিনিস। এটি ঠিক যে রুবির আসলে কার্যকারিতা রাখে না। এবং তার মানে আমার বক্তব্যটি সঠিক। আপনি আনবাউন্ড পদ্ধতিতে কল করতে পারেন যেন এটি পাইথনের কোনও ফাংশন। এবং এটি আসলে দরকারী, উদাহরণস্বরূপ আপনি উদাহরণস্বরূপ যে কোনও শ্রেণীর উপর কোনও শ্রেণীর সংজ্ঞায়িত একটি পদ্ধতিতে কল করতে পারেন যা কোনও শ্রেণীর নেই, যা কখনও কখনও দরকারী।
লেনার্ট রেজেব্রো

7

আমি পাইথন বর্ণনাকারী এপিআই উল্লেখ করতে চাই যা একটিকে অবজেক্ট-টু-অ্যাট্রিবিউট "যোগাযোগ" কে মঞ্জুরি দেয়। এটিও লক্ষণীয় যে পাইথন-এ __getattribute__পদ্ধতিটির ডিফল্ট প্রয়োগের মাধ্যমে প্রদত্ত ডিফল্টকে ওভাররাইড করে বিকল্প প্রোটোকল প্রয়োগ করা যায় free আমি উপরোক্ত সম্পর্কে আরও বিশদ দিন। বর্ণনাকারী সঙ্গে নিয়মিত ক্লাস হয় __get__, __set__বা এবং / __delete__পদ্ধতি। দোভাষী যখন এর মতো কিছু মুখোমুখি হন anObj.anAttr, নিম্নলিখিতটি সম্পাদিত হয়:

  • __getattribute__পদ্ধতিটি anObjচাওয়া হয়
  • __getattribute__ ক্লাস ডেক থেকে অ্যান্ট্র্ট অবজেক্ট পুনরুদ্ধার করে
  • এটা পরীক্ষা abAttr বস্তুর আছে কিনা __get__, __set__বা __delete__callable বস্তু
  • প্রসঙ্গটি (যেমন, কলার অবজেক্ট বা শ্রেণি, এবং মান, পরবর্তীগুলির পরিবর্তে, যদি আমরা সেটর করে থাকি) কলযোগ্য বস্তুটিতে পৌঁছে দেওয়া হয়
  • ফলাফল ফিরে আসে।

যেমনটি উল্লেখ করা হয়েছিল, এটি ডিফল্ট আচরণ। পুনরায় প্রয়োগের মাধ্যমে প্রোটোকল পরিবর্তন করতে একজন মুক্ত __getattribute__

এই কৌশলটি সজ্জকারের চেয়ে অনেক বেশি শক্তিশালী।


6

রুবি ব্যবহার করে ধারাবাহিকতা সমর্থন তৈরি করেছেন callcc

অতএব আপনি অ্যাম্ব-অপারেটরের মতো দুর্দান্ত জিনিসগুলি প্রয়োগ করতে পারেন


আমি কলসিসি বুঝতে পারতাম। আপনি কি ম্যাকার্থির অ্যামবিগিউস অপারেটরের চেয়ে আরও বেশি জাগতিক অ্যাপ্লিকেশন দৃশ্য দিতে পারেন, এর মেধার প্রশংসা করতে? আমি রিয়েল-ওয়ার্ল্ড কিছু বোঝাতে চাইছি, সেই মজাদার সিএস স্টাফ নয় ?!
থমাস

"ফানসি সিএস স্টাফ" আসল। : শেখা নিতে কিছু সময় ব্যয় intertwingly.net/blog/2005/04/13/Continuations-for-Curmudgeons
স্টিফেন Eilert


5

পাইথনের ডকাস্ট্রিং রয়েছে এবং রুবি নেই ... বা এটি না হলে এগুলি পাইথনের মতো সহজেই অ্যাক্সেসযোগ্য নয়।

পুনশ্চ. আমি যদি ভুল, খুব সুন্দর দয়া করে একটি উদাহরণ ছেড়ে? আমার একটি কাজ আছে যে আমি খুব সহজেই ক্লাসে মনিপাইপ করতে পারতাম তবে আমি "নেটিভ উপায়ে" কোনও ফিচারের ডক্ট্রিংয়ের মতো চাই।


3
আর ডক্ট্রিং নেই, তবে, আরডিওক আছে। হ্যাঁ, সহজে অ্যাক্সেসযোগ্য নয়, তবে 100% লুকানোও নয়।
ওমর কুরেশি 14

রুবি ডকস্ট্রিং ব্যবহার করে না। এটি অন্যভাবে ডকুমেন্টেশন করে।
চক

1
ওমর: হ্যাঁ, আমি rdoc সম্পর্কে জানি কিন্তু আফিক, তারা পাইথনের ডকাস্ট্রিংয়ের মতো "অ্যাক্সেসযোগ্য" নয়। উদাহরণস্বরূপ, যদি আমার একটি ক্লাস থাকে এবং আমি ক্লাসের মধ্যে থেকে rdoc ডকুমেন্টেশনটি আউটপুট করতে চাই তবে এটির দুর্দান্ত মোটা কাজ। আমি যা করেছি তা হ'ল আমি রি ডকুমেন্টেশন উত্পন্ন করি যা আমি আপ টু ডেট রাখার চেষ্টা করি এবং তারপরে নিজেই তথ্যটি আনতে পারি। অজগরটির ডকাস্ট্রিংয়ের মতো একই স্তরের অবধি অবশ্যই না ..
রসানী

ডকাস্টিংগুলি ডক্টেট সরবরাহ করতে ব্যবহার করা যেতে পারে। রুবির কি এমন কিছু আছে?
লেনার্ট রেগেব্রো

2
হ্যাঁ, এটিকে "রুবি ডকটেস্ট" বলা হয়। যতদূর ডক্টেটস সম্পর্কিত, এগুলি যা সত্যিই গুরুত্বপূর্ণ তা হ'ল আপনার কোথাও পরীক্ষারযোগ্য কোড স্নিপেটগুলি অন্তর্ভুক্ত রয়েছে এমন পাঠযোগ্য ডকুমেন্টেশন রয়েছে - এটি কোনও ডক্টরসিংয়ে বা কোনও মন্তব্যেই কোনও পার্থক্য রাখে না।
চক

5

কমান্ডলাইন থেকে রুবির একটি লাইন বাই লুপ ওভার ইনপুট ফাইল ('-n' পতাকা) রয়েছে যাতে এটি AWK এর মতো ব্যবহার করা যায়। এই রুবি ওয়ান লাইনার:

ruby -ne 'END {puts $.}'

AWK ওয়ান-লাইনারের মতো লাইনগুলি গণনা করবে:

awk 'END{print NR}'

রুবিল পার্লের মাধ্যমে এটি বৈশিষ্ট্য পেয়েছে, যা পার্লের সাথে স্ল্যাশডমিনগুলি পার্লের সাথে চালানোর উপায় হিসাবে এডাব্লুকে থেকে এনেছে যেহেতু তারা যেভাবে কাজ করে সেগুলি পরিবর্তন না করে।


1
আমি যুক্ত করতে চাই পাইথনের কমান্ড লাইন সমর্থনটি বরং দুর্বল। অনুপস্থিত স্বয়ংক্রিয় লুপটি ছাড়াও আপনি একক লাইনে বেশ কয়েকটি বিবৃতি দিতে পারবেন না এবং এটি অনুবাদকের কাছে একক-স্ট্রিং কমান্ড লাইন আর্গুমেন্ট হিসাবে পাস করতে পারবেন না। কমপক্ষে আমি তা করতে ব্যর্থ হয়েছি।
থমাস

অবশ্যই আপনি করতে পারেন. তবে আপনার (কোনও otehr ভাষার সাথে) সংলগ্ন হওয়া দরকার হবে উদ্ধৃতিগুলিতে।
লেনার্ট রেজেব্রো

পাইথনটি কমান্ডলাইনে ব্যবহারের জন্য তৈরি করা হয় না, যেহেতু আপনি কিছু জিনিস সম্পর্কে স্পষ্ট করতে হবে (যেমন sys.stdin) আপনি যদি সেভাবে এটি ব্যবহার করতে চানpython -c "import sys; print len(list(sys.stdin))"
u0b34a0f6ae

5

রুবির সিগিলস এবং টোভিগল রয়েছে, পাইথন নেই।

সম্পাদন করা : এবং একটি খুব গুরুত্বপূর্ণ জিনিস যা আমি ভুলে গেছি (সর্বোপরি, পূর্ববর্তীটি ছিল কেবলমাত্র একটু শিখার জন্য :- পি):

পাইথনের একটি জেআইটি সংকলক ( সাইকো ) রয়েছে, দ্রুত কোড ( পাইরেক্স ) লেখার জন্য দৃষ্টিকটু নিম্ন স্তরের ভাষা এবং ইনলাইন সি ++ কোড ( ওয়েভ ) যুক্ত করার ক্ষমতা রয়েছে ।


সত্য, তবে এটি কেবল বাক্য গঠন।
লেননার্ট রেজেব্রো

6
ঠিক আছে, আপনি যদি এই রাস্তায় যেতে চান: উভয়ই টুরিং-সম্পূর্ণ। অন্য সব কিছুই কেবল সিনট্যাক্স।
জার্গ ডব্লু মিটাগ

হ্যাঁ এবং একটি importax সিনট্যাক্স পার্থক্য ;-)
ফোরট্রান

1
আপনি @foo বা self.foo লিখলে এটি কীভাবে গুরুত্বপূর্ণ?
লেনার্ট রেজেব্রো

1
@ জার্গ: ঠিক আছে, এটিকে তখন "সিনট্যাক্স" ছাড়া আর কিছু বলুন। মুল বক্তব্যটি হ'ল @ ফু এবং সেলফ.ফু একই কাজ করে, এটি আসলে রুবির কোনও কার্যকারিতা নয় এবং পাইথন তা করেন না।
লেনার্ট রেজেব্রো

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

আমি নিশ্চিত নই যে এটি জেনারেটরের মতো একই, তবে এমবি হিসাবে রুবি ১.৯ রুবীর মতো

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

রেফারেন্স: http://blog.nuclearsquid.com/writings/ruby-1-9- কি-s-new- কি-s- পরিবর্তন

"কীওয়ার্ড আর্গুমেন্টস"

সেখানে তালিকাবদ্ধ আইটেম দুটিই রুবিতে সমর্থিত, যদিও আপনি এটির মতো ডিফল্ট মানগুলি এড়িয়ে যেতে পারেন না। আপনি হয় ক্রম যেতে পারেন

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 প্রকৃতপক্ষে কলিং স্কোপটিতে ভ্যারিয়েবল সি নির্ধারণ করে 5 মান, এবং প্যারামিটার বি মান 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

এই ক্ষেত্রে স্বতঃ শ্রেণি, এবং এই কোডটি "কাকা" প্রিন্ট করবে। ক্লাসের নাম মুদ্রণ করার উপায় নেই বা অন্য উপায়ে পাইথনের ক্লাস সংজ্ঞা বডি থেকে ক্লাস অ্যাক্সেস করতে পারে।


আপনি কি প্রথম পয়েন্টের জন্য আরও বিশদ (কোডের মতো) সরবরাহ করতে পারেন?
Loïc Wolff

উদাহরণ কোডটি একটি ভাল ধারণা, আমি যুক্ত করেছি, যদিও এই মামলাটি তুচ্ছ।
লেনার্ট রেজেব্রো

@ সাইলেন্টগোস্ট: আমি এখনই সত্যই অস্পষ্ট নয় এমন একটির কথা ভাবতে পারি না। :)
লেনার্ট রেজেব্রো

আপনি অজগাতে ক্লাসের ভিতরে ক্লাসের নামটি অ্যাক্সেস করতে পারবেন: ক্লাস ফু (): ডিফ থিম __ (স্ব): মুদ্রণ করুন __ শ্রেণি __ নাম__
txwikinger

1
@ টেক্সউইকিঞ্জার: হ্যাঁ, তবে ক্লাসের বডির মধ্যে নয়, যা classবিবৃতি হিসাবে একই সময়ে কার্যকর করা হয় ।
বাসটিয়েন লোনার্ড

4

সিনট্যাক্স কোনও ছোটখাট জিনিস নয়, এটি আমরা কীভাবে ভাবি তার সরাসরি প্রভাব ফেলে। আমরা যে সিস্টেমগুলি ব্যবহার করি তার জন্য আমরা যে বিধি তৈরি করি তার উপরও এর সরাসরি প্রভাব রয়েছে। উদাহরণস্বরূপ আমাদের গাণিতিক সমীকরণ বা বাক্যগুলি লেখার কারণে ক্রিয়াকলাপগুলির ক্রম রয়েছে order গণিতের জন্য মানক স্বরলিপি লোকেদের এটি একাধিক উপায়ে পড়তে এবং একই সমীকরণের মাধ্যমে বিভিন্ন উত্তরে পৌঁছতে দেয়। আমরা যদি উপসর্গ বা পোস্টফিক্স স্বরলিপি ব্যবহার করে থাকি তবে মানগুলি গণনা করার ক্রমটির নিয়ম না রেখে কেবল কী সংখ্যাগুলি ম্যানিপুলেটেড করা উচিত তা আলাদা করার জন্য আমরা বিধি তৈরি করতাম।

স্ট্যান্ডার্ড স্বরলিপিটি এটিকে স্পষ্ট করে তোলে যে আমরা যে সংখ্যার বিষয়ে কথা বলছি তার ক্রমটি অস্পষ্ট করার জন্য ক্রমটি তৈরি করার সময়। উপসর্গ এবং পোস্টফিক্স স্বরলিপি সংখ্যাকে দ্বিধাগ্রস্থ করার সময় প্লেইন গণনা করার ক্রমটি তৈরি করে। পাইথনে ইতিমধ্যে মাল্টলাইন ল্যাম্বডাস থাকত যদি এটি সিন্ট্যাকটিক হোয়াইটস্পেসের কারণে সৃষ্ট সমস্যাগুলির জন্য না হয়। (অগত্যা সুস্পষ্ট ব্লক ডিলিমিটারগুলি যোগ না করে এই ধরণের জিনিসটি টেনে আনার জন্য প্রস্তাবগুলি রয়েছে))

আমি শর্ত লিখতে আরও সহজ মনে করি যেখানে শর্তটি লিখতে চাইলে যদি শর্তটি মিথ্যা হয় তবে রুবির বা বিবৃতিতে উদাহরণস্বরূপ রুবি বা অন্যান্য ভাষায় নির্মাণকৃত সমতুল্য "যদি-না" নির্মাণের তুলনায় রুবিতে বিবৃতি দিয়ে লিখতে অনেক সহজ হয়। মানুষ আজ যে ভাষাগুলি ব্যবহার করছে সেগুলির বেশিরভাগই যদি ক্ষমতায় সমান হয় তবে প্রতিটি ভাষার বাক্য গঠনকে কীভাবে ক্ষুদ্র বিষয় হিসাবে বিবেচনা করা যেতে পারে? ব্লক এবং উত্তরাধিকারের প্রক্রিয়া ইত্যাদির মতো নির্দিষ্ট বৈশিষ্ট্যগুলির পরে সিনট্যাক্স কোনও ভাষার সর্বাধিক গুরুত্বপূর্ণ অংশ, খুব সম্ভবত একটি অতিপৃষ্ঠীয় জিনিস।

যা স্তবকীয় তা হ'ল সৌন্দর্যের নান্দনিক গুণাবলী যা আমরা সিনট্যাক্সকে স্বীকার করি। আমাদের জ্ঞান কীভাবে কাজ করে, সিনট্যাক্স কী করে তার সাথে নান্দনিকতার কোনও সম্পর্ক নেই।


এই "মন্তব্য "টি কোনও মন্তব্যে যা অনুমতি দেওয়া হয়েছে তার চেয়ে তিনগুণ দীর্ঘ, নির্বিশেষে।
অ্যান্ড্রু গ্রিম

আমার কাছে উত্তর হিসাবে এটি আসলে ভাল মনে হয়। "এটি একটি মন্তব্য" বিট সম্পাদনা করেছে।
বিল

3

রুবির "পদ্ধতি অনুপস্থিত" প্রক্রিয়াটির উল্লেখ করা কিছুই দেখে অবাক হয়ে গেলেন। আমি ভাষাটির বৈশিষ্ট্যটির শক্তির উদাহরণ হিসাবে, রেলগুলিতে Find_by _... পদ্ধতির উদাহরণ দেব। আমার অনুমান যে পাইথনের ক্ষেত্রেও অনুরূপ কিছু কার্যকর করা যেতে পারে তবে আমার জ্ঞানের ভিত্তিতে এটি স্থানীয়ভাবে নেই।


পাইথনের গেট_ট্রিবিউট রয়েছে যা মূলত রুবির মেথড_মিসিংয়ের মতো একই কাজ সম্পাদন করে।
মিপাদি

3
রুবির যে কোনও কথা উল্লেখ করা থাকলে অজগর বিকাশকারীরা কেন সবসময় এত বাট আঘাত পান? আপনি সত্য অস্বীকার করতে পারবেন না।
অ্যারোনা

method_missingকিছু ক্ষেত্রে পাইথন মধ্যে emulated করা যেতে পারে: class M(): def __getattr__(self, n): return lambda: "Missing! " + n; M().hi()। তবে কিছুটা পার্থক্য রয়েছে এবং আমি সন্দেহ করি এটি পাইথনে

1
@ ডিজে ট্রিপলথ্রেট: আমি অস্বীকার করি যে এটি সত্য।
লেনার্ট রেজেব্রো

3

পাইথন এবং রুবির মধ্যে ল্যাম্বডাসের আরেকটি পার্থক্যটি পল গ্রাহামের একুমুলেটর জেনারেটরের সমস্যা দ্বারা প্রদর্শিত হয় । এখানে আবার মুদ্রিত:

একটি ফাংশন ফু লিখুন যা একটি সংখ্যা এন নেয় এবং একটি ফাংশন দেয় যা আমি একটি নম্বর নিয়ে আসে এবং i দিয়ে n বৃদ্ধি করে দেয় returns দ্রষ্টব্য: (ক) যে সংখ্যাটি, পূর্ণসংখ্যার নয়, (খ) যা বর্ধিত নয়, দ্বারা বৃদ্ধি পেয়েছে।

রুবিতে আপনি এটি করতে পারেন:

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

পাইথনে, আপনি এন এর অবস্থা ধরে রাখতে একটি অবজেক্ট তৈরি করবেন:

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 ... ল্যাম্বদা {| i | n + i} দেয়: f = foo (10) f (2) >> 12 f (3) >> 13 ... রুবিতেও সংখ্যা পরিবর্তনযোগ্য - আপনি উদাহরণস্বরূপ 2 + = 1 বলতে পারবেন না। এবং নিয়মিত পাইথন ফাংশনে এন + = 1 ঠিক আছে তবে ল্যাম্বডা নয়। সুতরাং এটি "এন" কী তা হ'ল ফাংশনটি চালু হওয়ার পরে এবং লাম্বদা গঠন হওয়ার পরে এটি তৈরি হয়েছিল, আপনি ল্যাম্বডায় অ্যাসাইনমেন্ট করতে পারেন (কেবলমাত্র প্রকাশের পরিবর্তে), এবং এটি এন এর মান ধরে রাখতে পারে একাধিক কল উপর।
ডর্মসবি

পাইথনে আপনাকে এ জাতীয় দৈর্ঘ্যে যাওয়ার দরকার নেই বলে আমি মনে করি। অন্যান্য কার্যের মধ্যে কার্যগুলি সংজ্ঞায়িত করা যায়। def foo(n): def f(i): return n + i return f
এফএমসি

2
এটি যদিও এখনও একই নয়, এবং আপনার উদাহরণটি উপরের মন্তব্যে পাইথন ল্যাম্বদার সমতুল্য। রুবি সংস্করণ একটি ল্যাম্বডা তৈরি করে যা কলগুলির মধ্যে স্থিতি রাখে। আপনার পোস্ট করা উদাহরণটি আপনাকে এন এর জন্য একটি প্রারম্ভিক মানটি কনফিগার করতে দেয়, তবে যে ফাংশনটি ফাংশন দেয় তা সর্বদা সেই শুরু মানটি করে। রুবি সংস্করণ বৃদ্ধি। সুতরাং আসুন বলুন f = foo (10)। পাইথন সংস্করণ: f (1) => 11, f (1) => 11. রুবি সংস্করণ f.call (1) => 11, f.call (1) => 12.
ডর্মসবি

def foo(n): L=[n] def f(i): L[0] += i return L[0] return f। পাইথন 3 এ আপনি nonlocalকীওয়ার্ডটি ব্যবহার করতে পারেন ।
jfs

3

পাইথন optionচ্ছিক যুক্তির নাম দিয়েছে

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

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

আফাইক রুবিতে কেবল যুক্তি রয়েছে কারণ ফাংশন ঘোষণায় খ = 2 একটি প্রভাব যা সর্বদা যুক্ত হয়।


3
"রুবিতে কেবল যুক্তি অবস্থান রয়েছে কারণ ফাংশন ঘোষণায় খ = 2 এমন একটি প্রভাব যা সর্বদা যুক্ত হয়" এমনকি এর অর্থ কী?
ঘোড়াগুয়ে

3
ডুনো আপনি কোন গ্রহে বাস করছেন, তবে def my_method(param1, optional = false)রুবিতে কাজ করেন 1.8.6, 1.8.7 এবং সম্ভবত 1.9!
রবার্ট কে

5
উইকড ফ্লেয়া এবং যে লোকেরা তাঁর মন্তব্যটিকে সমর্থন করেছে, আপনি উদাহরণটিকে খুব কাছাকাছি দেখেন নি। তিনি কলটিতে bপ্যারামিটারটি এড়িয়ে যেতে সক্ষম funcএবং এটি এখনও এর ডিফল্ট বজায় রাখে। এটি হ'ল bস্বাক্ষরের দ্বিতীয় যুক্তি, তবে দ্বিতীয় প্যারামিটারটি দিয়ে তিনি উপস্থাপন করে এড়িয়ে যেতে পারেন c=। এটিকে অনুকরণ করতে রুবি হ্যাশ ব্যবহার করে তবে এটি একেবারে একই নয়।
maček

2

রুবি এম্বেড করেছেন ডকুমেন্টেশন:

 =begin

 You could use rdoc to generate man pages from this documentation

 =end

5
আপনি যে পদ্ধতিগুলি / শ্রেণিতে সেগুলি স্থাপন করেছেন তার অংশ হিসাবে ডকাস্ট্রিংগুলি শেষ হয়। সুতরাং আপনি সাহায্য (ক্লাস) করতে পারেন এবং এটি আপনাকে ডকাস্ট্রিংস ইত্যাদি প্রদর্শন করবে
লেনার্ট রেজেব্রো


2

রুবিতে, আপনি যখন কোনও ফাইল প্রয়োজনীয়তার সাথে আমদানি করেন, তখন সেই ফাইলটিতে সংজ্ঞায়িত সমস্ত জিনিস আপনার গ্লোবাল নেমস্পেসে শেষ হবে।

সঙ্গে জাহাজী আপনি "করতে পারেন আপনার নামস্থান cluttering ছাড়া লাইব্রেরীর দরকার "।

# 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"
>> Foo2 :: সংস্করণ
=> "২.০.০"

এটি বরং একটি নতুন উত্তর ছিল না, একটি মন্তব্য করা উচিত ছিল।
লেনার্ট রেজেব্রো
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.