শক্তিশালী <=> দুর্বল টাইপিং কেবলমাত্র একটি ডেটাটাইপের জন্য অন্য ভাষাতে ভাষা দ্বারা স্বয়ংক্রিয়ভাবে কতটা বা কতটা স্বল্পমাত্রায় জোর করা হয় তার ধারাবাহিকতা সম্পর্কে নয়, তবে প্রকৃত মানগুলি কতটা দৃ strongly় বা দুর্বল টাইপ করা হয়। পাইথন এবং জাভাতে এবং বেশিরভাগ সি # তে মানগুলিতে পাথরের ধরণ রয়েছে। পার্লে, খুব বেশি কিছু নেই - একটি ভেরিয়েবলে সঞ্চয় করার জন্য কেবল কয়েক মুঠো বিভিন্ন ভ্যালুটিটাইপ রয়েছে।
একের পর এক কেস খুলি।
পাইথন
পাইথন উদাহরণে 1 + "1"
, +
অপারেটর কল __add__
টাইপ জন্য int
এটা স্ট্রিং দান "1"
একটি আর্গুমেন্ট হিসাবে - NotImplemented এই ফলাফল, তবে:
>>> (1).__add__('1')
NotImplemented
এরপরে, দোভাষী দোসরটির চেষ্টা করে __radd__
:
>>> '1'.__radd__(1)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
AttributeError: 'str' object has no attribute '__radd__'
এটি ব্যর্থ হওয়ার +
সাথে সাথে অপারেটর ফলাফলটি ব্যর্থ হয় TypeError: unsupported operand type(s) for +: 'int' and 'str'
। যেমনটি, ব্যতিক্রমটি শক্তিশালী টাইপিং সম্পর্কে খুব বেশি কিছু বলে না, তবে অপারেটর একই যুক্তিতে স্বয়ংক্রিয়ভাবে তার যুক্তি +
জোর করে না এমনটি একটি পয়েন্টার যে পাইথনটি ধারাবাহিকতায় সবচেয়ে দুর্বলতমভাবে টাইপ করা ভাষা নয়।
অন্যদিকে, পাইথন মধ্যে 'a' * 5
হয় বাস্তবায়িত:
>>> 'a' * 5
'aaaaa'
এটাই,
>>> 'a'.__mul__(5)
'aaaaa'
অপারেশনটি পৃথক হওয়ার জন্য কয়েকটি শক্ত টাইপিংয়ের প্রয়োজন - তবে *
গুণনের আগে মানগুলিকে সংখ্যায় জোর করে দেওয়ার বিপরীতে মানগুলি দুর্বলভাবে টাইপ করার প্রয়োজন হয় না।
জাভা
জাভা উদাহরণটি কেবল String result = "1" + 1;
কাজের সুবিধার্থে কাজ করে, অপারেটরটি +
স্ট্রিংয়ের জন্য ওভারলোড হয়। জাভা +
অপারেটর একটি তৈরিতে ক্রম প্রতিস্থাপন StringBuilder
(দেখুন এই ):
String result = a + b;
// becomes something like
String result = new StringBuilder().append(a).append(b).toString()
এটি বরং খুব স্থিতিশীল টাইপিংয়ের উদাহরণ, সত্যিকারের জবরদস্তি ছাড়াই - StringBuilder
একটি পদ্ধতি রয়েছে append(Object)
যা এখানে বিশেষভাবে ব্যবহৃত হয়। ডকুমেন্টেশন নিম্নলিখিত বলে:
Object
যুক্তির স্ট্রিং প্রতিনিধিত্ব যুক্ত করে App
সামগ্রিক প্রভাবটি হুবহু হ'ল যুক্তিটি পদ্ধতি দ্বারা একটি স্ট্রিংয়ে রূপান্তরিত হয়েছিল String.valueOf(Object)
এবং সেই স্ট্রিংয়ের অক্ষরগুলি এই অক্ষর অনুসারে যুক্ত হয়েছিল।
যেখানে String.valueOf
তখন
অবজেক্ট আর্গুমেন্টের স্ট্রিং প্রতিনিধিত্ব করে। [প্রত্যাবর্তন] যদি আর্গুমেন্ট হয় null
, তারপরে সমান একটি স্ট্রিং "null"
; অন্যথায়, এর মান obj.toString()
ফিরে আসে।
সুতরাং এটি ভাষার দ্বারা নিখুঁতভাবে কোনও জবরদস্তির ঘটনা নয় - প্রতিটি উদ্বেগকে বস্তুগুলিতেই অর্পণ করে।
সি শার্প
এখানে জোন স্কিটির উত্তর অনুসারে , অপারেটর +
এমনকি string
ক্লাসের জন্য ওভারলোড হয় না - জাভা সদৃশ, এটি স্থির এবং শক্তিশালী উভয় টাইপিংয়ের জন্য ধন্যবাদ সংকলক দ্বারা উত্পন্ন সুবিধা।
পার্ল
পারলডাটা যেমন ব্যাখ্যা করে,
পার্লের তিনটি বিল্ট-ইন ডেটা টাইপ রয়েছে: স্কেলারস, স্কেলারের অ্যারে এবং স্কেলারের এসোসিয়েটিভ অ্যারে, "হ্যাশ" নামে পরিচিত। একটি স্কেলার হ'ল একটি একক স্ট্রিং (যে কোনও আকারের, কেবলমাত্র উপলব্ধ মেমরি দ্বারা সীমাবদ্ধ), সংখ্যা বা কোনও কিছুর একটি রেফারেন্স (যা পেরেলিফে আলোচনা করা হবে)। সাধারণ অ্যারেগুলিকে ০ দিয়ে শুরু করে স্কেলারের তালিকা অর্ডার করা হয়, 0 দিয়ে শুরু করে হ্যাশগুলি তাদের সম্পর্কিত স্ট্রিং কী দ্বারা সূচকযুক্ত স্কেলারের মানগুলির আনর্ডারড সংগ্রহ।
পার্লের সংখ্যা, বুলিয়ানস, স্ট্রিং, নালস, undefined
এস, অন্যান্য অবজেক্টের রেফারেন্স ইত্যাদির জন্য পৃথক ডেটা টাইপ নেই - এটি কেবল এই সমস্তগুলির জন্য একটি প্রকার, স্কেলারের ধরণের; 0 0 এর মতো একটি স্কেলারের মান। একটি স্ট্যালার ভেরিয়েবল যা একটি স্ট্রিং হিসাবে সেট করা হয়েছিল তা সত্যই একটি সংখ্যায় পরিবর্তিত হতে পারে এবং সেখান থেকে যদি কেবল একটি সংখ্যার প্রসঙ্গে অ্যাক্সেস করা হয় তবে "কেবল একটি স্ট্রিং" থেকে আলাদা আচরণ করতে পারে। স্কেলার পার্লে যে কোনও কিছু রাখতে পারে, এটি সিস্টেমে যতটা অবজেক্ট রয়েছে ততটাই। যদিও পাইথনে নামগুলি কেবলমাত্র বস্তুগুলিকে বোঝায়, পার্লের নামগুলিতে স্কেলারের মানগুলি পরিবর্তনযোগ্য অবজেক্ট। তদ্ব্যতীত, অবজেক্ট ওরিয়েন্টেড টাইপ সিস্টেমটি এর উপরে চটকানো রয়েছে: পার্ল - স্কেলার, তালিকাগুলি এবং হ্যাশগুলিতে মাত্র 3 টি ডাটাটাইপ রয়েছে। পার্লের কোনও ব্যবহারকারী সংজ্ঞায়িত অবজেক্ট হ'ল একটি bless
প্যাকেজটির এড (এটি পূর্ববর্তী 3 টির মধ্যে একটিরই নির্দেশক) - আপনি যে কোনও মান নিতে এবং যে কোনও তাত্ক্ষণিক সময়ে কোনও শ্রেণিকে আশীর্বাদ করতে পারেন।
পার্ল এমনকি আপনি কদম মানগুলির শ্রেণি পরিবর্তন করতে পারবেন - পাইথনে এটি সম্ভব নয় যেখানে কোনও শ্রেণির একটি মান তৈরি করতে আপনার স্পষ্টভাবে সেই শ্রেণীর অন্তর্গত object.__new__
বা একই জাতীয় মান নির্ধারণ করতে হবে । পাইথনে আপনি সৃষ্টির পরে অবজেক্টের মূল পরিবর্তন করতে পারবেন না, পার্লে আপনি আরও কিছু করতে পারেন:
package Foo;
package Bar;
my $val = 42;
# $val is now a scalar value set from double
bless \$val, Foo;
# all references to $val now belong to class Foo
my $obj = \$val;
# now $obj refers to the SV stored in $val
# thus this prints: Foo=SCALAR(0x1c7d8c8)
print \$val, "\n";
# all references to $val now belong to class Bar
bless \$val, Bar;
# thus this prints Bar=SCALAR(0x1c7d8c8)
print \$val, "\n";
# we change the value stored in $val from number to a string
$val = 'abc';
# yet still the SV is blessed: Bar=SCALAR(0x1c7d8c8)
print \$val, "\n";
# and on the course, the $obj now refers to a "Bar" even though
# at the time of copying it did refer to a "Foo".
print $obj, "\n";
সুতরাং প্রকারের পরিচয়টি দুর্বলভাবে ভেরিয়েবলের সাথে আবদ্ধ এবং ফ্লাইয়ের কোনও রেফারেন্সের মাধ্যমে এটি পরিবর্তন করা যেতে পারে। আসলে, আপনি যদি
my $another = $val;
\$another
শ্রেণি পরিচয় নেই, তবুও \$val
আশীর্বাদযুক্ত রেফারেন্স দেবে।
টি এল; ডিআর
পার্লের কাছে দুর্বল টাইপিংয়ের বিষয়ে আরও অনেক কিছুই রয়েছে কেবলমাত্র স্বয়ংক্রিয় জবরদস্তির চেয়ে, এবং এগুলি আরও রয়েছে যে মূল্যের ধরণগুলি পাথর হিসাবে স্থাপন করা হয় না, পাইথনের বিপরীতে যা গতিশীলভাবে এখনও খুব জোরালোভাবে টাইপ করা ভাষা। পাইথন দেয় TypeError
উপর 1 + "1"
, একটি ইঙ্গিত যে ভাষা শক্তিশালী ভাবে টাইপ করা হয় যদিও কিছু দরকারী করছেন বিপরীত এক, জাভা বা C # হিসেবে তাদের শক্তিশালী ভাবে টাইপ ভাষায় হচ্ছে প্রতিরোধ না।