python - সহজ ভাষায় পাইথন ৩ pdf




রুবি কি পাইথন আছে না, এবং বিপরীত? (20)

পাইথন বনাম রুবিয়ের অনেক আলোচনা আছে এবং আমি তাদের সবাইকে সম্পূর্ণরূপে অসহায় মনে করি কারণ তারা X কে ভাষার Y অক্ষরটি কেন ঘিরে ঘুরে বেড়ায়, অথবা যে ভাষায় Y তে X থাকে না, তা আসলে এটি করে। আমিও পাইথনকে কেন পছন্দ করি তাও আমি জানি, কিন্তু এটিও বিষয়ভিত্তিক, এবং যে কেউকে বেছে নিতে সাহায্য করবে না, কারণ তারা আমার মতো ডেভেলপমেন্টের একই স্বাদ পাবে না।

সুতরাং, ইচ্ছাকৃতভাবে পার্থক্য তালিকা আকর্ষণীয় হতে হবে। সুতরাং কোন "পাইথন এর lambdas sucks"। পরিবর্তে রুবি এর lambdas কি পাইথন এর করতে পারেন কি ব্যাখ্যা। কোন বিষয়কতা। উদাহরণ কোড ভাল!

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

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

রুবি ক্লাস বর্গ একটি বর্গ রেফারেন্স আছে

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

একটি উদাহরণ:

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

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

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

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

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

রুবি ব্লক আছে

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

রুবি:

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

Python (রুবি ব্লক Python বিভিন্ন গঠন অনুরূপ):

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

নীতি ভিন্ন যদিও, ফলাফল strikingly অনুরূপ।

রুবি কার্যকরী শৈলী (পাইপ মত) প্রোগ্রামিং আরও সহজে সমর্থন করে

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]

উপরে ব্লক উদাহরণ সঙ্গে এই বিপরীতে।

Python নমনীয় নাম স্থান হ্যান্ডলিং আছে

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

from themodule import * , ফাইলটি একটি মডিউল এবং আপনি তার নামগুলিকে from themodule import * দিয়ে আমদানি করতে পারেন, যার ফলে আপনি যদি চান তবে from themodule import * দূষিত করে। তবে আপনি কেবলমাত্র নির্বাচিত নামগুলিকে from themodule import aname, another করতে পারেন অথবা 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 এর পদ্ধতি # উৎস_ অবস্থান ব্যবহার করে ফাইলগুলি রাননামে পুনরুদ্ধার করা যেতে পারে

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

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

পাইথন তালিকা / dict বোঝা আছে

পাইথন:

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


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

সঙ্গে Cargo আপনি "করতে পারেন আপনার নামস্থান 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 = import("foo-1.0.0")
>> Foo2 = import("foo-2.0.0")
>> Foo1::VERSION
=> "1.0.0"
>> Foo2::VERSION
=> "2.0.0"

পাইথন উদাহরণ

ফাংশন পাইথন মধ্যে প্রথম শ্রেণীর ভেরিয়েবল হয়। আপনি একটি ফাংশন ঘোষণা করতে পারেন, এটি একটি বস্তুর চারপাশে পাস করতে পারেন এবং এটি ওভাররাইট করতে পারেন:

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!"    

অবকাঠামো পাশে কিছুটা বেশি:

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

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

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


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

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

এই স্ট্রিং মধ্যে শব্দ বিপরীত:

sentence = "backwards is sentence This"

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

  1. শব্দ মধ্যে বাক্য বিভক্ত
  2. শব্দ বিপরীত
  3. আবার একটি স্ট্রিং মধ্যে শব্দ যোগদান

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

sentence.split.reverse.join ' '

সঠিকভাবে আপনি এটি সম্পর্কে চিন্তা করেন, একই ক্রম অনুসারে, অন্যের পরে একটি পদ্ধতি কল করুন।

পাইথন ইন, এটি আরও দেখতে হবে:

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

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


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

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


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

কিন্তু এই সম্পর্কে কি:

Python মধ্যে gracefully এবং ভাল কি করা যেতে পারে যে রুবি যেমন সৌন্দর্য এবং ভাল প্রকৌশল, বা বিপরীত সঙ্গে করা যাবে না?

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


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

তুলনা করা

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

থেকে

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

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

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

একসঙ্গে তার terse সঙ্গে epxressive সিনট্যাক্স এটা এই ধরনের কাজের জন্য নিখুঁত।

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

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


রুবি এর website :

পাইবিথন, রুবিতে, সাদৃশ্যগুলি ...

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

পাইবিনের বিপরীতে পার্থক্য রুবিতে ...

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


নির্লজ্জভাবে কপি / থেকে আটকানো: অ্যালেক্স Martelli উপর উত্তর " কি রুবি পাইথন চেয়েও ভালো " থেকে থ্রেড comp.lang.python মেইলিং তালিকা।

18 অক্টোবর 2003, 10:50 এ এরিক ম্যাক ফ্রান্সিস লিখেছেন:

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

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

পাইথন মানুষের পরিবর্তে রুবিকে জিজ্ঞেস করা কি এতো বেশি অর্থ না?

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

অ্যালেক্স


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

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


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

Python ফাংশন হিসাবে unbound পদ্ধতি চিকিত্সা করে

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

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

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


এই পর্যায়ে, পাইথন এখনও আরও ভাল ইউনিকোড সমর্থন আছে


রুবি sigils এবং twigils আছে, পাইথন না।

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

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


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

 =begin

 You could use rdoc to generate man pages from this documentation

 =end

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

একটি উদাহরণ:

class Kaka
  puts self
end

এই ক্ষেত্রে স্বয়ং ক্লাস, এবং এই কোড "কাকা" প্রিন্ট আউট হবে। ক্লাস নামটি প্রিন্ট করার কোন উপায় নেই বা অন্য উপায়ে পাইথন বিভাগের বর্গ সংজ্ঞা সংস্থা থেকে ক্লাসটি অ্যাক্সেস করে।


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

  • __getattribute__পদ্ধতি anObjআহ্বান করা হয়
  • __getattribute__ ক্লাস dict থেকে anAttr বস্তু উদ্ধার
  • এটি ABAttr বস্তুর আছে কিনা __get__, __set__বা __delete__কলযোগ্য বস্তু কিনা পরীক্ষা করে
  • প্রেক্ষাপটে (অর্থাত্, আহ্বানকারীর পরিবর্তে, কলার বস্তু বা শ্রেণী এবং মান, পরবর্তীতে, যদি আমরা সংযোজন করি) কলযোগ্য বস্তুর কাছে প্রেরণ করা হয়
  • ফলাফল ফিরে।

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

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


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

সুতরাং আপনি amb-operator মত শীতল জিনিস বাস্তবায়ন করতে পারেনamb-operator


রুবি লাইন লুপ দ্বারা ইনপুট ফাইল ('-এন' পতাকা) কমান্ড লাইন থেকে একটি লাইন আছে তাই এটি AWK মত ব্যবহার করা যেতে পারে। এই রুবি এক-মাছ ধরার নৌকা:

ruby -ne 'END {puts $.}'

AWK এক-মাছ ধরার মত লাইনে গণনা করা হবে:

awk 'END{print NR}'

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





ruby