কোনও অন্তর্নিহিত রূপান্তর কেন হতে পারে না?


14

আমি এটি যেমন বুঝতে পারি, অন্তর্নিহিত রূপান্তরগুলি ত্রুটির কারণ হতে পারে।

তবে এর কোনও অর্থ হয় না - তাহলে সাধারণ রূপান্তরগুলিও ত্রুটি সৃষ্টি করে না?

কেন নেই

len(100)

ভাষা হিসাবে এটি ব্যাখ্যা (বা সংকলন) দ্বারা কাজ করুন

len(str(100))

বিশেষত যেহেতু এটি কাজ করার একমাত্র উপায় (আমি জানি)। ভাষাটি জানে ত্রুটিটি কী, কেন এটি সংশোধন করবেন না?

এই উদাহরণের জন্য আমি পাইথন ব্যবহার করেছি, যদিও আমি অনুভব করি যে এই ছোটটির জন্য এটি মূলত সর্বজনীন।


2
perl -e 'print length(100);'প্রিন্টস 3.

2
এবং এইভাবে ভাষা এবং তার টাইপ সিস্টেমের প্রকৃতি। এটি পাইথনের নকশার অংশ।

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

5
@ পাইক্রাস্ট কীভাবে পাইথনকে রূপান্তর করার কথা রয়েছে? এটি সত্য নয় যে সমস্ত সম্ভাব্য রূপান্তর একই ফলাফল ফিরে আসবে।
বাকুরিউ

7
@ পাইক্রাস্ট: স্ট্রিং এবং অ্যারেগুলি পুনরাবৃত্ত হয়। strকোন ইন্টিকে পুনরাবৃত্তিতে রূপান্তর করার অন্তর্নিহিত উপায় হবে কেন ? কীভাবে range? বা bin( hex, oct) বা chr(বা unichr)? এই সমস্ত পরিস্থিতিতে পুনরাবৃত্তিযোগ্য, এমনকি যদি strএই পরিস্থিতিতে আপনার পক্ষে সবচেয়ে স্পষ্ট মনে হয়।
njzk2

উত্তর:


37

কি এটা এর মূল্য জন্য, len(str(100)), len(chr(100))এবং len(hex(100))সব ভিন্ন। strহয় না , যেহেতু একটি স্ট্রিং একটি পূর্ণসংখ্যা থেকে পাইথন এর একটির বেশি বিভিন্ন রূপান্তর আছে, এটি কাজ করা একমাত্র উপায়। এর মধ্যে অবশ্যই একটি সর্বাধিক সাধারণ, তবে এটি যে আপনি বোঝাতে চেয়েছিলেন তা ছাড়া এটি অগত্যা চলে না। অন্তর্নিহিত রূপান্তরটির আক্ষরিক অর্থ, "এটি বলা ছাড়াই যায়"।

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

এ কারণেই (বেশিরভাগ সময়) পাইথন স্পষ্টতই প্রচ্ছন্নকে পছন্দ করে, এটি এটিকে ঝুঁকি না দেওয়া পছন্দ করে। পাইথন যেখানে টাইপ জবরদস্তি করে তা মূল ক্ষেত্রেটি গাণিতিক। এটা করতে পারবেন 1 + 1.0, কারণ বিকল্প খুব সঙ্গে বসবাস করতে বিরক্তিকর হতে পারে, কিন্তু এটা করার অনুমতি দেয় না 1 + "1", কারণ এটা মনে করে যে আপনি কিনা আপনি কি এটি বলতে নির্দিষ্ট করতে থাকা উচিত int("1"), float("1"), ord("1"), str(1) + "1", নাকি অন্য কিছু। এটি ফলাফলের ধরণের পছন্দগুলি বেছে নেওয়ার জন্য বিধিগুলি সংজ্ঞায়িত করতে সক্ষম (1,2,3) + [4,5,6]হওয়া সত্ত্বেও এটি অনুমতি দেয় না , যেমন ফলাফলের ধরণের পছন্দ বাছাই করার জন্য নিয়মকে সংজ্ঞায়িত করে 1 + 1.0

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


+1 কীভাবে প্রারম্ভিক অনুমানটি, যা lenকেবলমাত্র এক প্রকারের সাথে কাজ করতে পারে তা মৌলিকভাবে ত্রুটিযুক্ত demonst
কেচালোক্স

2
@KChaloux: আসলে, আমার উদাহরণে str, chrএবং hexএকই ধরনের না সব প্রত্যাবর্তন! আমি অন্যরকম ধরণের কথা চিন্তা করার চেষ্টা করছিলাম যার নির্মাণকর্তা কেবল একটি ইনট নিতে পারেন, তবে আমি এখনও কিছু নিয়ে আসিনি। আদর্শ এমন কিছু ধারক হবে Xযেখানে len(X(100)) == 100;-) numpy.zerosকিছুটা অস্পষ্ট মনে হয়।
স্টিভ জেসপ 26'15

2
সম্ভাব্য সমস্যার উদাহরণগুলির জন্য এটি দেখুন: docs.google.com/docament/d/… এবং ডি্যান্সটলসফলওয়্যার
ট্যালকস /

1
অন্তর্নিহিত রূপান্তর (আমার মনে হয় বলপ্রয়োগ বলা হয়) মত থাকার কদর্য কাপড় সৃষ্টি করতে পারে a == b, b == cকিন্তু a == cনা সত্য হচ্ছে।
বিগুসাচ

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

28

আমি এটি যেমন বুঝতে পারি, অন্তর্নিহিত রূপান্তরগুলি ত্রুটির কারণ হতে পারে।

আপনি একটি শব্দ অনুপস্থিত: অন্তর্নিহিত রূপান্তরগুলি রানটাইম ত্রুটির কারণ হতে পারে ।

আপনার দেখানোর মতো সাধারণ মামলার জন্য, আপনি কী বোঝাতে চেয়েছেন তা পুরোপুরি পরিষ্কার। তবে ভাষা ক্ষেত্রে কাজ করতে পারে না। তাদের নিয়ম নিয়ে কাজ করা দরকার। অন্যান্য অনেক পরিস্থিতিতে, প্রোগ্রামার কোনও ত্রুটি করেছে (ভুল ধরণের ব্যবহার করে) বা প্রোগ্রামার কোডটি তাদের কোড বোঝাচ্ছে বলে ধরেছিল তা করে কিনা তা পরিষ্কার নয়।

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

একটি বিষয় লক্ষণীয় হ'ল অন্তর্নিহিত রূপান্তরগুলি কম্পাইলারটিকে আরও জটিল করে তোলে। আপনাকে চক্র সম্পর্কে আরও সতর্ক হওয়া দরকার (আসুন এ থেকে বি তে এই রূপান্তরটি চেষ্টা করুন; উফ যে কাজ করেনি, তবে বি থেকে ক এ রূপান্তর আছে! এবং তারপরে আপনাকে সি এবং ডি আকারের চক্রগুলি সম্পর্কেও চিন্তা করতে হবে ), যা আপনাকে অন্তর্নিহিত রূপান্তর এড়ানোর জন্য একটি ছোট অনুপ্রেরণা।


বেশিরভাগ ক্ষেত্রে এমন ফাংশনগুলির বিষয়ে কথা বলা হয়েছিল যা কেবলমাত্র এক ধরণের সাথে কাজ করতে পারে, রূপান্তরটি সুস্পষ্ট করে তোলে। এমন এক কী হবে যা একাধিক প্রকারের সাথে কাজ করবে এবং আপনি যে ধরণের প্রকারটি রেখেছেন তাতে কী পার্থক্য রয়েছে? মুদ্রণ ("295") = মুদ্রণ (295), যাতে ভেরিয়েবল বাদে কোনও পার্থক্য তৈরি হবে না। আপনি যা বলেছিলেন তা 3 ডি অনুচ্ছেদ ব্যতীত অন্যথায় বোঝায় ... আপনি কি পুনরাবৃত্তি করতে পারবেন?
কোয়েলক্লেফ

30
@ পাইক্রাস্ট - 123 + "456", আপনি কি "123456" বা 579 চান? প্রোগ্রামিং ভাষাগুলি প্রসঙ্গটি করে না, সুতরাং তাদের পক্ষে "এটি নির্ধারণ করা" কঠিন, যেহেতু সংযোজনটি করা হচ্ছে সেই প্রসঙ্গে তাদের জানা দরকার they কোন অনুচ্ছেদটি অস্পষ্ট?
টেলাস্টিন

1
এছাড়াও, সম্ভবত বেস -10 হিসাবে ব্যাখ্যাটি আপনি চেয়েছিলেন তা নয়। হ্যাঁ, অন্তর্নিহিত রূপান্তরগুলি একটি ভাল জিনিস , তবে কেবল যেখানে তারা সম্ভবত কোনও ত্রুটিটি আড়াল করতে পারে না।
উত্সাহক

13
@ পাইক্রাস্ট: সত্যি বলতে আমি কখনই len(100)ফিরে আসব আশা করি না 3। এর উপস্থাপনায় বিটের সংখ্যা (বা বাইট) গণনা করা আমার পক্ষে এটি আরও স্বজ্ঞাত মনে হবে 100
user541686

3
আমি @ মেহেরদাডের সাথে রয়েছি, আপনার উদাহরণ থেকে এটি স্পষ্ট যে আপনি এটি 100% সুস্পষ্ট বলে মনে করেন যে এটি আপনাকে 100 len(100)নম্বর দশমিক উপস্থাপনের চরিত্রের পরিমাণ দেয় But তাদের মধ্যে. হেক্সাডেসিমাল উপস্থাপনের বিট বা বাইট বা অক্ষরের সংখ্যা ( 64-> 2 টি অক্ষর) কেন ফিরিয়ে আনতে হবে তা আপনি দৃ .় তর্ক করতে পারেন len()
ফানউকর্ম

14

অন্তর্নিহিত রূপান্তরগুলি করা বেশ সম্ভব। আপনি যখন সমস্যায় পড়েন সেই পরিস্থিতিটি যখন আপনি জানেন না যে কোন উপায়ে কোনও কাজ করা উচিত।

এর উদাহরণ জাভাস্ক্রিপ্টে দেখা যায় যেখানে +অপারেটর বিভিন্ন সময়ে বিভিন্ন উপায়ে কাজ করে।

>>> 4 + 3
7
>>> "4" + 3
43
>>> 4 + "3"
43

যদি আর্গুমেন্টগুলির মধ্যে একটি স্ট্রিং হয়, তবে +অপারেটরটি একটি স্ট্রিং কনক্রিটেশন, অন্যথায় এটি সংযোজন।

যদি আপনাকে একটি যুক্তি দেওয়া হয় এবং এটি স্ট্রিং বা পূর্ণসংখ্যা কিনা তা জানেন না এবং এটির সাথে যোগ করতে চান, এটি কিছুটা গোলমাল হতে পারে।

এটির সাথে মোকাবিলা করার আরেকটি উপায় হ'ল বেসিক হেরিটেজ (যেটি পার্ল অনুসরণ করে - দেখুন প্রোগ্রামিংটি হার্ড, আসুন স্ক্রিপ্টিং যান ... )

বেসিকটিতে, lenফাংশনটি কেবল স্ট্রিংয়ের সাথে যুক্ত হওয়ার অর্থ দেয় ( ভিজ্যুয়াল বেসিকের জন্য ডকস : "কোনও বৈধ স্ট্রিং এক্সপ্রেশন বা ভেরিয়েবল নামের Exp ফাইলপুট ফাংশন। ")।

পার্ল প্রসঙ্গের এই ধারণাটি অনুসরণ করে। বিভ্রান্তির যে জন্য ধরনের অন্তর্নিহিত রূপান্তর সঙ্গে জাভাস্ক্রিপ্ট বিদ্যমান +অপারেটর কখনও কখনও উপরন্তু হচ্ছে এবং কখনো কখনো সংযুক্তকরণের Perl ঘটতে না কারণ +হয় সবসময় উপরন্তু এবং .হয় সবসময় সংযুক্তকরণের।

যদি কোনও স্কেলারের প্রসঙ্গে কিছু ব্যবহৃত হয়, তবে এটি একটি স্কেলার (উদাহরণস্বরূপ স্কেলার হিসাবে একটি তালিকা ব্যবহার করে, তালিকাটি তার দৈর্ঘ্যের সাথে সম্পর্কিত একটি সংখ্যা হিসাবে মনে হয়)। আপনি যদি স্ট্রিং অপারেটর ব্যবহার করেন ( eqসমতা পরীক্ষার cmpজন্য, স্ট্রিং তুলনার জন্য) স্কেলারটি এমনভাবে ব্যবহৃত হয় যেন এটি স্ট্রিং was তেমনি, যদি কোনও গণিতের প্রসঙ্গে ( ==সমতা পরীক্ষার <=>জন্য এবং সংখ্যাসূচক তুলনার জন্য) কিছু ব্যবহার করা হত তবে স্কেলারটি ব্যবহার করা হয় যেন এটি একটি সংখ্যা।

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

পার্ল - পিএইচপি এর নিকটতম মামাতো ভাইয়ের কাছে গিয়ে এমন পরিস্থিতি রয়েছে যেখানে অপারেটর স্ট্রিং বা সংখ্যাগত প্রসঙ্গে যে কোনও বিষয়ে কাজ করতে পারে এবং আচরণটি লোকদের জন্য অবাক করে দিতে পারে। ++অপারেটর এক ধরনের উদাহরণ। সংখ্যায়, এটি প্রত্যাশার মতো ঠিক আচরণ করে। কোনও স্ট্রিংয়ের উপর অভিনয় করার সময় যেমন "aa"স্ট্রিংটিকে ( $foo = "aa"; $foo++; echo $foo;প্রিন্টগুলি ab) বাড়িয়ে তোলে । এটি azবর্ধিত হবে যাতে যখন বর্ধিত হয় ba। এটি এখনও বিশেষ অবাক করার মতো নয়।

$foo = "3d8";
echo "$foo\n";
$foo++;
echo "$foo\n";
$foo++;
echo "$foo\n";
$foo++;
echo "$foo\n";

( আদর্শ )

এটি মুদ্রণ করে:

3d8
3d9
3e0
4

অন্তর্নিহিত রূপান্তরগুলি এবং অপারেটরগুলির একই স্ট্রিংয়ে ভিন্ন ভিন্ন অভিনয় করার বিপদগুলিতে স্বাগতম। (পার্ল সেই কোড ব্লকটিকে কিছুটা ভিন্নভাবে পরিচালনা করে - এটি স্থির করে যে অপারেটর প্রয়োগ করা হয় "3d8"যখন ++শুরু থেকে একটি সংখ্যাসূচক মান হয় এবং সরাসরি চলে যায় 4( আইডোন )) এই আচরণটি পার্লপটিতে ভালভাবে বর্ণনা করা হয়েছে : স্বতঃবৃদ্ধি এবং স্বয়ংক্রিয় হ্রাস )

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

এই নকশার পার্থক্যগুলি বিভিন্ন ভাষায় বাড়ে। পাইথনে একটি সংখ্যার দৈর্ঘ্য পাওয়ার একটি উপায় রয়েছে। অন্তর্নিহিত রূপান্তর এই দর্শনের বিপরীতে।

সম্পর্কিত পড়া: কেন রুবি স্ট্রিং-এ ফিক্সনামের অন্তর্নিহিত রূপান্তর করে না?


আইএমএইচও, একটি ভাল ভাষা / কাঠামোর প্রায়শই এমন কাজ করার একাধিক উপায় থাকতে হবে যা সাধারণ কর্নারের কেসগুলি আলাদাভাবে পরিচালনা করে (একবারে একটি ভাষা বা কাঠামোয় একবার সাধারণ কর্নার কেসকে 1000 প্রোগ্রামের চেয়ে 1000 বারের চেয়ে বেশি পরিচালনা করা ভাল); দুই অপারেটর বেশিরভাগ সময় একই কাজটি করে এমন বিষয়টিকে খারাপ জিনিস হিসাবে বিবেচনা করা উচিত নয়, যদি তাদের আচরণগুলির মধ্যে পার্থক্য থাকে তবে প্রতিটি পরিবর্তনের সুবিধা হতে পারে। এটা দুই সাংখ্যিক ভেরিয়েবল তুলনা করা কঠিন হওয়া উচিত নয় xএবং yহিসাবে একটি সমানতা সম্পর্ক বা র্যাঙ্কিং উত্পাদ এমনভাবে কিন্তু IIRC পাইথন এর তুলনা অপারেটরদের ...
supercat

... না উভয়ই সমতা সম্পর্ক এবং র‌্যাঙ্কিং বাস্তবায়ন করে এবং পাইথন কোনও সুবিধাজনক অপারেটর সরবরাহ করে না।
সুপারক্যাট

12

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

ফলাফলটি মোট নৈরাজ্য, যেখানে "4 এ" 6 এ যোগ করা 6.16667।

কেন? ঠিক আছে, কারণ দুটি ভেরিয়েবলের প্রথমটি একটি সংখ্যা, সুতরাং ফলাফলটি সংখ্যাসূচক হবে। "4 এ" তারিখ হিসাবে বিশ্লেষণ করা হয় এবং "4 এএম" হিসাবে দেখা যায়। 4 এএম 4: 00/24: 00, বা 1/6 দিনের এক দিন (0.16667)। 6 এ যুক্ত করুন এবং আপনি 6.16667 পাবেন।

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

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

দ্রুত ব্যর্থ হওয়া এবং ত্রুটির প্রতিবেদন করার পরিবর্তে কোল্ডফিউশন আপনার জন্য ডেটাটাইপ রূপান্তরগুলি পরিচালনা করবে। এবং একটি ভাল উপায়ে না।

অবশ্যই, আপনি ডেটকম্পারের মতো সুস্পষ্ট ফাংশনগুলিতে কল করে অন্তর্নিহিত রূপান্তরগুলি ঠিক করতে পারেন ... তবে তারপরে আপনি অন্তর্নিহিত রূপান্তরটির "সুবিধা" হারিয়ে ফেলেছেন।


কোল্ডফিউজনের জন্য, এটি বিকাশকারীদের ক্ষমতায়নে সহায়তা করার একটি উপায়। বিশেষত যখন এই সমস্ত বিকাশকারী এইচটিএমএল হয় (কোল্ডফিউশন ট্যাগগুলির সাথে কাজ করে, এটিকে সিএফএমএল বলা হয়, পরে তারা <cfscript>পাশাপাশি স্ক্রিপ্টিংও যুক্ত করে , যেখানে আপনাকে সমস্ত কিছুর জন্য ট্যাগ যুক্ত করার দরকার নেই)। আপনি যখন কিছু কাজ করতে চান তখন এটি ভাল কাজ করে। তবে যখন আপনার জিনিসগুলি আরও সুনির্দিষ্টভাবে ঘটতে হবে তখন আপনার এমন একটি ভাষা প্রয়োজন যা দেখে মনে হয় যে এটি কোনও ভুল হতেই পারে।


1
বাহ, "সম্পূর্ণ অরাজকতা" সত্যিই!
hoosierEE

7

আপনি বলছেন যে অন্তর্নিহিত ক্রিয়াকলাপগুলির জন্য অন্তর্নিহিত রূপান্তরগুলি একটি ভাল ধারণা হতে পারে int a = 100; len(a), যেখানে আপনার স্পষ্টতই কল করার আগে ইনটকে স্ট্রিংয়ে রূপান্তর করতে চান।

কিন্তু আপনি বিস্মরণ করা.এই কল হতে পারে যে চিহ্নগুলি সিন্টেক্সের দ্ব্যর্থহীন, কিন্তু তারা প্রোগ্রামার যারা পাস বোঝানো দ্বারা তৈরি একটি টাইপো প্রতিনিধিত্ব করতে পারে a1, যা হয় একটি স্ট্রিং। এটি একটি স্বীকৃত উদাহরণ, তবে আইডিইগুলি পরিবর্তনশীল নামের জন্য স্বতঃপূরণ প্রদান করে, এই ভুলগুলি ঘটে।

টাইপ সিস্টেমটি আমাদের ত্রুটিগুলি এড়াতে সহায়তা করে এবং যে ভাষাগুলি কঠোর প্রকারের পরীক্ষা করা পছন্দ করে তাদের জন্য অন্তর্নিহিত রূপান্তরগুলি এটিকে হ্রাস করে।

== দ্বারা সম্পাদিত সমস্ত অন্তর্নিহিত রূপান্তরগুলির সাথে জাভাস্ক্রিপ্টের দুর্দশাগুলি পরীক্ষা করে দেখুন, এখন অনেকেই নো-ইমপ্লিট-রূপান্তর === অপারেটরের সাথে স্টিক থাকার পরামর্শ দেয়।


6

আপনার বক্তব্যের প্রসঙ্গে মুহুর্তের জন্য বিবেচনা করুন। আপনি বলছেন এটি "একমাত্র উপায়" এটি কাজ করতে পারে তবে আপনি কি সত্যই নিশ্চিত যে এটি এর মতো কাজ করবে? এই সম্পর্কে কি:

def approx_log_10(s):
    return len(s)
print approx_log_10(3.5)  # "3" is probably not what I'm expecting here...

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

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


3

অন্তর্নিহিত রূপান্তরগুলি কাজ করার জন্য একটি আসল ব্যথা হতে পারে। পাওয়ারশেলে:

$a = $(dir *.xml) # typeof a is a list, because there are two XML files in the folder.
$a = $(dir *.xml) # typeof a is a string, because there is one XML file in the folder.

হঠাৎ করে দ্বিগুণ টেস্টিংয়ের প্রয়োজন হয় এবং দ্বিগুণ বাগের মধ্যে দ্বিগুণ ত্রুটিহীন রূপান্তর ছাড়াই হবে।


2

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

double d = 3.1415926;
// code elided
int i = d;

Castালাই আপনাকে আলগা নির্ভুলতা তৈরি করবে, যা সহজেই বাগ হতে পারে। সুতরাং সংকলক সংকলন করতে অস্বীকার করেছে। সুস্পষ্ট কাস্ট ব্যবহার করে আপনি সংকলককে বলছেন: "আরে, আমি জানি আমি কী করছি।" এবং সে যাবে: "ঠিক আছে!" এবং সংকলন।


1
প্রকৃতপক্ষে, আমি অন্তর্ভুক্ত বিষয়গুলির চেয়ে বেশিরভাগ সুস্পষ্ট কাস্টকে অপছন্দ করি; আইএমএইচও, কেবলমাত্র এর (X)yঅর্থ হওয়া উচিত "আমি মনে করি Y এক্সে রূপান্তরযোগ্য; সম্ভব হলে রূপান্তরটি করুন, না হলে ব্যতিক্রম নিক্ষেপ করুন"; যদি একটি রূপান্তর সফল, এক ভবিষ্যদ্বাণী করা কি ফলে মূল্যের ধরণ থেকে রূপান্তর সম্পর্কে কোনো বিশেষ নিয়ম জানি না করেও * হতে হবে সক্ষম হওয়া উচিত yটাইপ X। যদি -1.5 এবং 1.5 কে পূর্ণসংখ্যায় রূপান্তর করতে বলা হয় তবে কিছু ভাষায় উত্পন্ন হবে (-2,1); কিছু (-2,2), কিছু (-1,1), এবং কিছু (-1,2)। যদিও সি এর নিয়মগুলি খুব কমই অস্পষ্ট ...
সুপারক্যাট

1
... ধরণের রূপান্তরটি মনে হয় এটি কাস্টের মাধ্যমে পদ্ধতির মাধ্যমে আরও যথাযথভাবে সম্পাদিত হবে (খুব খারাপ N
সুপারক্যাট 26'15

আপনি সংকলকটি বলছেন " আমি মনে করি আমি জানি আমি কী করছি"।
gnasher729

@ gnasher729 এর মধ্যে কিছু সত্যতা আছে :)
পল কার্টেসার

1

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

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

অন্য দিন আমার এক বন্ধু তার 2 বছর বয়সী কি জিজ্ঞাসা করেছিল 20 + 20 কী এবং সে 2020 জবাব দিয়েছে I আমি আমার বন্ধুকে বলেছিলাম, "সে জাভাস্ক্রিপ্ট প্রোগ্রামার হতে চলেছে"।

জাভাস্ক্রিপ্টে:

20+20
40

20+"20"
"2020"

এইভাবে আপনি অন্তর্ভুক্ত কাস্টমগুলি তৈরি করতে পারে এমন সমস্যাগুলি দেখতে পাচ্ছেন এবং কেন এটি ঠিক করা যায় না something আমি যুক্তিটি ঠিক করবো তা হল স্পষ্ট বর্ণবাদী ব্যবহার করা।

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