রুবির ব্লক রয়েছে; পাইথন না।
পাইথনের ফাংশন রয়েছে; রুবি তা করে না। পাইথনে, আপনি যে কোনও ফাংশন বা পদ্ধতি গ্রহণ করতে এবং এটি অন্য ফাংশনে পাস করতে পারেন। রুবিতে, সমস্ত কিছুই একটি পদ্ধতি এবং পদ্ধতিগুলি সরাসরি পাস করা যায় না। পরিবর্তে, এগুলি পাস করার জন্য আপনাকে এগুলি প্রোকস এ মুড়ে রাখতে হবে।
রুবি এবং পাইথন উভয়ই ক্লোজারকে সমর্থন করে তবে বিভিন্ন উপায়ে। পাইথনে, আপনি অন্য ফাংশনের ভিতরে কোনও ফাংশন সংজ্ঞায়িত করতে পারেন। অভ্যন্তরীণ ফাংশনে বাইরের ফাংশন থেকে ভেরিয়েবলগুলি পড়ার অ্যাক্সেস রয়েছে তবে লেখার অ্যাক্সেস নেই। রুবিতে, আপনি ব্লকগুলি ব্যবহার করে ক্লোজারগুলি সংজ্ঞায়িত করেন। সমাপ্তিতে বহিরাগত সুযোগ থেকে ভেরিয়েবলের সম্পূর্ণ পঠন এবং লেখার অ্যাক্সেস রয়েছে।
পাইথনের তালিকা উপলব্ধি রয়েছে, যা বেশ প্রকাশ্য। উদাহরণস্বরূপ, আপনার যদি সংখ্যাগুলির একটি তালিকা থাকে তবে আপনি লিখতে পারেন
[x*x for x in values if x > 15]
15 এর চেয়ে বেশি মানের সমস্ত মানের স্কোয়ারের একটি নতুন তালিকা পেতে। রুবিতে আপনাকে নিম্নলিখিত লিখতে হবে:
values.select {|v| v > 15}.map {|v| v * v}
রুবি কোডটি কমপ্যাক্ট হিসাবে মনে হচ্ছে না। এটি তত দক্ষ নয় যেহেতু এটি প্রথমে 15 টিরও বেশি মানের মানগুলি সংক্ষিপ্ত মধ্যবর্তী অ্যারেতে মানকে অ্যারে রূপান্তর করে Then মধ্যবর্তী অ্যারেটি তখন বাইরে ফেলে দেওয়া হয়। সুতরাং, রুবি গণনার সময় মেমরির 3 টি অ্যারে সমাপ্ত করে; পাইথন কেবল ইনপুট তালিকা এবং ফলাফল তালিকা প্রয়োজন।
পাইথন অনুরূপ মানচিত্রের বোধগম্যতা সরবরাহ করে।
পাইথন টিপলসকে সমর্থন করে; রুবি তা করে না। রুবিতে, আপনাকে টিপলস অনুকরণ করতে অ্যারে ব্যবহার করতে হবে।
রুবি সুইচ / কেস স্টেটমেন্ট সমর্থন করে; পাইথন না।
রুবি স্ট্যান্ডার্ড expr ? val1 : val2
টার্নারি অপারেটরকে সমর্থন করে ; পাইথন না।
রুবি শুধুমাত্র একক উত্তরাধিকার সমর্থন করে। আপনার যদি একাধিক উত্তরাধিকার নকল করতে হয়, আপনি মডিউলগুলি সংজ্ঞায়িত করতে পারেন এবং মডিউল পদ্ধতিগুলিকে ক্লাসে টানতে মিশ্রণগুলি ব্যবহার করতে পারেন। পাইথন মডিউল মিক্স-ইনগুলির চেয়ে একাধিক উত্তরাধিকারকে সমর্থন করে।
পাইথন কেবলমাত্র একক-লাইন ল্যাম্বদা ফাংশন সমর্থন করে। রুবি ব্লকগুলি, যা ধরণের / ল্যাম্বডা ফাংশনের ধরণের, নির্বিচারে বড় হতে পারে। এই কারণে, রুবি কোডটি সাধারণত পাইথন কোডের চেয়ে বেশি কার্যকরী শৈলীতে লেখা হয়। উদাহরণস্বরূপ, রুবিতে কোনও তালিকা লুপ করতে আপনি সাধারণত করেন
collection.each do |value|
...
end
ব্লকটি একটি ফাংশনটি পাস করার মতো কাজ করে collection.each
। আপনি যদি পাইথনে একই জিনিসটি করেন, আপনাকে একটি নামকৃত অভ্যন্তরীণ ফাংশনটি সংজ্ঞায়িত করতে হবে এবং তারপরে প্রতিটি পদ্ধতিতে এটি সংগ্রহ করতে হবে (যদি তালিকাটি এই পদ্ধতিটিকে সমর্থন করে):
def some_operation(value):
...
collection.each(some_operation)
এটি খুব সুন্দরভাবে প্রবাহিত হয় না। সুতরাং, পাইথনে সাধারণত নিম্নলিখিত অ-কার্যকরী পদ্ধতির ব্যবহার করা হত:
for value in collection:
...
নিরাপদ উপায়ে সংস্থানগুলি ব্যবহার করা দুটি ভাষার মধ্যে বেশ আলাদা different এখানে সমস্যাটি হ'ল আপনি কিছু সংস্থান বরাদ্দ করতে চান (একটি ফাইল খুলুন, একটি ডাটাবেস কার্সার সংগ্রহ করুন ইত্যাদি), এতে কিছু স্বেচ্ছাচারিত ক্রিয়াকলাপ সম্পাদন করতে পারেন এবং তারপরে কোনও ব্যতিক্রম ঘটলে এমনকি নিরাপদ উপায়ে এটি বন্ধ করুন।
রুবিতে, যেহেতু ব্লকগুলি ব্যবহার করা খুব সহজ (দেখুন # 9), আপনি সাধারণত এই প্যাটার্নটিকে এমন একটি পদ্ধতি হিসাবে কোড করবেন যা সংস্থানটিতে ক্রিয়াকলাপ সম্পাদনের জন্য একটি ব্লক নেয় operation
পাইথনে, স্বেচ্ছাসেবী ক্রিয়াকলাপের জন্য একটি ক্রিয়াকলাপটি পাস করা কিছুটা ক্লানকিয়ার, যেহেতু আপনাকে একটি নামযুক্ত, অভ্যন্তরীণ ফাংশন লিখতে হবে (# 9 দেখুন)। পরিবর্তে, পাইথন with
নিরাপদ সংস্থান হ্যান্ডলিংয়ের জন্য একটি বিবৃতি ব্যবহার করে। দেখুন আমি কীভাবে পাইথন অবজেক্টটি সঠিকভাবে পরিষ্কার করব? আরো বিস্তারিত জানার জন্য.