জাভাস্ক্রিপ্ট ব্যতীত অন্য কোন ভাষার ব্রেস শুরুর অবস্থানগুলির (একই লাইন এবং পরবর্তী লাইন) মধ্যে পার্থক্য রয়েছে?


91

আজ, আমি যখন এলোমেলোভাবে জাভাস্ক্রিপ্ট নিদর্শন ও'রিলি বইটি পড়ছিলাম, তখন আমি একটি আকর্ষণীয় জিনিস পেয়েছি (রেফারেন্সের জন্য পৃষ্ঠা 27)।

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

function test_function1() {
    return
    {
        name: 'rajat'
    };
}

var obj = test_function1();
alert(obj);  //Shows "undefined"

যখন

function test_function2() {
    return {
        name: 'rajat'
    };
}

var obj = test_function2();
alert(obj); //Shows object

জেএসফিডাল ডেমো

অন্য কোনও ভাষার কি এই জাতীয় আচরণ রয়েছে? যদি তাই হয় তবে অবশ্যই আমার অভ্যাসটি অবশ্যই পরিবর্তন করতে হবে .. :)

আমি প্রধানত পিএইচপি, সি, সি ++, জাভা এবং রুবি সম্পর্কে উদ্বিগ্ন।


4
ক্রোম এবং আই 9 তে পুনরুত্পাদন করা হয়েছে, ভাল ক্যাচ: পি
গিডিওন

4
সাদা স্থান সংবেদনশীলতা কাজ করা যেতে পারে --- অজগর বা লাইন মোড ফোর্টারান তাকান --- কিন্তু সূক্ষ্ম সাদা স্থান সংবেদনশীলতা শয়তানের কাজ। গাহ! এটি যেমন মেক করা খারাপ!
ডিএমকেকে --- প্রাক্তন-মডারেটর বিড়ালছানা

এটা চিত্তাকর্ষক! ভাল লাগছে!
চেকরাইজ

এখন আমি জানতে চাই কেন জাভাস্ক্রিপ্ট এইভাবে আচরণ করে।
চেকরাইজ

4
@ চেকরাইজ: আমি এখানে বিধিগুলি সংক্ষিপ্ত করছি: ব্লগস.এমএসএনএন
এরিক লিপার্ট

উত্তর:


53

যে কোন ভাষা সীমানা বিবৃতি সেমিকোলন (কিন্তু এর পরিবর্তে নতুন লাইন দিকে) ওপর নির্ভর করে না সম্ভাব্য এই অনুমতি দেয়। পাইথন বিবেচনা করুন :

>>> def foo():
...   return
...   { 1: 2 }
... 
>>> def bar():
...   return { 1: 2 }
... 
>>> foo()
>>> bar()
{1: 2}

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

Try
    Throw New Exception()
Catch ex As Exception
    Throw ex.GetBaseException()
End Try

' versus

Try
    Throw New Exception()
Catch ex As Exception
    Throw
    ex.GetBaseException()
End Try

আপনার উল্লিখিত ভাষাগুলি থেকে, রুবির একই সম্পত্তি রয়েছে। পিএইচপি, সি, সি ++ এবং জাভা কেবল এই কারণেই নয় যে তারা নিউলাইনটিকে হোয়াইটস্পেস হিসাবে ফেলে দেয় এবং বিবৃতিগুলি সীমিত করতে সেমিকোলনগুলির প্রয়োজন হয়।

এখানে রুবিতে পাইথনের উদাহরণ থেকে সমতুল্য কোড:

>> def foo
>>   return { 1 => 2 }
>> end
=> nil
>> def bar
>>   return
>>   { 1 => 2 }
>> end
=> nil
>> foo
=> {1=>2}
>> bar
=> nil

4
আপনার ভিবি উদাহরণটি পুরোপুরি তাৎপর্যপূর্ণ করে তোলে না কারণ আপনি লাইন-ধারাবাহিকতা ক্রম "_" ব্যবহার না করে ভিবি কখনও কখনও কোনও বিবৃতিকে একাধিক লাইন বিস্তৃত করতে দেয় না
ফুগ

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

@ ফুগ সত্য, এটি একেবারে গোটাচা নয়।
কনরাড রুডল্ফ

40

জাভাস্ক্রিপ্ট ইন্টারপ্রেটারটি ;প্রতিটি লাইনের শেষে স্বয়ংক্রিয়ভাবে একটি যোগ করে যদি এটি একটি না পায় (কিছু ব্যতিক্রম সহ, এখানে সেগুলিতে না আসে :)।

সুতরাং মূলত সমস্যাটি হ'ল ধনুর্বন্ধকের অবস্থান নয় (এটি এখানে বেশিরভাগ ভাষার মতো কোনও বস্তুর আক্ষরিক প্রতিনিধিত্ব করে, কোনও কোড ব্লক নয়), তবে এই সামান্য "বৈশিষ্ট্য" যা আপনার প্রথম উদাহরণটিকে return ;=> এ বাধ্য করে undefined। আপনি return ইএস 5 অনুমানের আচরণটি চেক করতে পারেন ।

অনুরূপ আচরণযুক্ত অন্য ভাষার জন্য, কনরাদের উত্তরটি দেখুন


4
উচ্চতর উত্তোলিত উত্তর, তবু এটি আসলে ভুল, দুঃখিত ব্যাখ্যাটি দুর্দান্ত তবে দয়া করে ভুলটি সংশোধন করুন।
কনরাড রুডল্ফ

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

4
তবে এটি সত্য নয় যে জেএস কিছু ব্যতিক্রম সহ "প্রতিটি লাইনের শেষে" "একটি সেমিকোলন প্রবেশ করান"; বরং এটি সাধারণত একটি সেমিকোলন সন্নিবেশ করে না এবং কেবলমাত্র কয়েকটি ক্ষেত্রে এটি ঘটে । এ কারণেই এটি এতগুলি গোটচেগুলির কারণ হয়।
রুখ

26

অবশ্যই. গুগলের গো প্রোগ্রামিং ল্যাঙ্গুয়েজ একটি খুব অনুরূপ আচরণ দেখায় (যদিও বিভিন্ন প্রভাব সহ)। সেখানে ব্যাখ্যা হিসাবে:

আসলে, যা ঘটে তা হ'ল আনুষ্ঠানিক ভাষা সেমিকোলন ব্যবহার করে, অনেকটা সি বা জাভা হিসাবে, তবে এগুলি প্রতিটি লাইনের শেষে স্বয়ংক্রিয়ভাবে প্রবেশ করা হয় যা বিবৃতিটির শেষের মতো লাগে। এগুলি আপনাকে নিজেরাই টাইপ করার দরকার নেই।

..স্নিপ ...

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

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


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

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

আমি উপবিষ্ট হব, আপনার দ্বিতীয় বাক্যটি পুরোপুরি ভুল হওয়ার কারণে এটি আমাকে নীচে নামাতে চায়। আমার ধারণা তারা বাতিল হয়ে গেছে। ;-)
রুখ

4
@রুখ আপনার মানে কি "গো ঠিক এটি হয়" বা আপনি রব পাইক সম্পর্কে কৌতুকের কথা উল্লেখ করছেন? পূর্ববর্তী ক্ষেত্রে, আমি "একই আচরণের দিকে যেতে দেখি" বলে মন্তব্য করতে পারি, পরবর্তীকালে, আমি যদি আমার লম্পট বিদ্রূপের হাস্যরক্ষাকে ঘৃণা করি তবে আমি দুঃখিত;)
ডেভ

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

14

এই প্রশ্নের উত্তর মোটামুটি সহজ। "স্বয়ংক্রিয় সেমিকোলন সন্নিবেশ" থাকা যে কোনও ভাষা সেই লাইনে সমস্যার মধ্যে থাকতে পারে। এই সমস্যা

return
{
     name: 'rajat'
};

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


6

এফডাব্লুআইডাব্লু, জেএসলিন্ট সেই সিনট্যাক্সের সাথে বেশ কয়েকটি সতর্কবার্তা জানিয়েছে:

$ jslint -stdin
function foo(){
  return
  { x: "y" };
}
^D
(3): lint warning: unexpected end of line; it is ambiguous whether these lines are part of the same statement
  return
........^

(3): lint warning: missing semicolon
  { x: "y" };
..^

(3): lint warning: unreachable code
  { x: "y" };
..^

(3): lint warning: meaningless block; curly braces have no impact
  { x: "y" };
..^

(3): lint warning: use of label
  { x: "y" };
.....^

(3): lint warning: missing semicolon
  { x: "y" };
...........^

(3): lint warning: empty statement or extra semicolon
  { x: "y" };
............^


0 error(s), 7 warning(s)

1

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

$ cat printEntities.awk 
# This prints all lines where the string ENTITY occurs
/ENTITY/ {
  print $0
}
$ awk -f printEntities.awk < /usr/share/texinfo/texinfo.dtd | wc -l
     119

পরিবর্তে যদি এই ছোট স্ক্রিপ্টটি তার নিজের লাইনে ব্রেস দিয়ে লেখা হয়, তবে এটিই ঘটবে:

$ cat printAll.awk 
# Because of the brace placement, the print statement will be executed
# for all lines in the input file
# Lines containing the string ENTITY will be printed twice,
# because print is the default action, if no other action is specified
/ENTITY/
{ 
   print $0 
}
$ awk -f printAll.awk < /usr/share/texinfo/texinfo.dtd | wc -l
     603
$ /bin/cat < /usr/share/texinfo/texinfo.dtd | wc -l
     484
$ 
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.