তীর (->) অপারেটরের অগ্রাধিকার / অগ্রাধিকার সবচেয়ে কম, বা কার্যনির্বাহী / সম্মিলিত কার্যভারের অগ্রাধিকার সর্বনিম্ন?


18

জেএলএস :

(->) সর্বনিম্ন প্রাধান্য অপারেটর একটি ল্যামডা মত প্রকাশের তীর হয় , অনুসৃত নিয়োগ অপারেটার দ্বারা।

কোন দিক অনুসরণ করা (অগ্রাধিকার বৃদ্ধি, অগ্রাধিকার হ্রাস)? - "অনুসরণ" মানে অ্যাসাইনমেন্টের উচ্চতর অগ্রাধিকার বা নিম্ন অগ্রাধিকার রয়েছে (তীর অপারেটরের ক্ষেত্রে)? আমার ধারণা, ক্রমবর্ধমান, কারণ "সর্বনিম্ন" (তীরের জন্য) অর্থ একেবারে নিম্নতম।

আমি যেমন বুঝতে পেরেছি, তীর (->) এই প্রিন্সটন অপারেটর অগ্রাধিকার সারণির একেবারে নীচে থাকা উচিত (এটি সমস্ত অ্যাসাইনমেন্ট অপারেটরগুলির নীচে), সুতরাং তীর (->) 0 (শূন্য) অগ্রাধিকার স্তর (সেই টেবিল অনুসারে) থাকবে।

আমি কি আমার বোঝার মধ্যে সঠিক?

পরীক্ষার ট্রাই বলে মনে হচ্ছে যে তীরের অগ্রাধিকার কমপক্ষে নির্ধারিত হিসাবে একই ... প্লাস স্পষ্ট করে জানিয়েছে যে তীরের সহযোগিতাটি বাম-> থেকে-> ডান (অ্যাসাইনমেন্টের বিপরীতে) is তীর সাহসীতার জন্য আমি কোনও জেএলএস উদ্ধৃতি পাই না।

আমি সবসময় মনে করতাম যে কোনও কারণে অগ্রাধিকার অগ্রাধিকার মূলত সর্বনিম্ন।


5
The lowest precedence operator is the arrow of a lambda expression.
কেয়ামান

2
হ্যাঁ, আপনার বোঝাপড়াটি সঠিক।
ইরান

4
যদি ->কম হয় , নিয়োগ অপারেটার কম থাকতে পারে না Er প্রাধান্য।
অ্যান্ডি টার্নার

IntFunction fo = a->b->a-b; // in test সাধারণভাবে -> এর অগ্রাধিকার / সাহচর্য প্রয়োগ করে। সুতরাং আমি স্পষ্ট করার সিদ্ধান্ত নিয়েছি -> পূর্ববর্তীত্ব / সাহচর্যতার পুরো জায়গাটি / পূর্ববর্তী সংস্থার তালিকায় কারণ এটি সম্পর্কে অনিশ্চিত বোধ করেছে।
কোড সম্পূর্ণ

1
@glglgl আপনার উদাহরণ IntUnaryOperator op; op = x -> x;আকর্ষণীয়। সম্ভবত (op = x) -> xবিবেচনা করা হয় না কারণ উত্পাদন op = xএকটি বৈধ উদাহরণ না LambdaParameters?
অ্যান্ডি টার্নার

উত্তর:


13

উদ্ধৃত জেএলএস পাঠ্যের আগের বাক্যটি নোট করুন :

অপারেটরদের মধ্যে অগ্রাধিকার ব্যাকরণ উত্পাদনের একটি শ্রেণিবিন্যাস দ্বারা পরিচালিত হয়।

জাভা ভাষার ব্যাকরণ নির্ধারণ করে যে কোন নির্মাণগুলি অপারেটরের অগ্রাধিকার এবং সম্ভাব্য licit

এমনকি আপনি যে রাজকুমার টেবিলটি সংযুক্ত করেছেন সেগুলি রাজ্যে:

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

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

এটি অস্পষ্টতা ছাড়াই যেমন, যেমন একটি মণি সংকলন করতে দেয়:

static Consumer<String> C;
static String S;
public static void main(String[] args)
{
  Runnable r;
  r = () -> C = s -> S = s;
}

10

প্রথমে আসুন এখানে ব্যবহারিক বিষয়টি ব্যাখ্যা করুন।

ধরে নিচ্ছি আপনার মতো সংজ্ঞা রয়েছে

IntUnaryOperator op;

নিম্নলিখিতটি কৃত্রিমভাবে স্বীকৃত এবং প্রত্যাশার মতো কাজ করে:

op = x -> x;

এটি হল, ভেরিয়েবলের intজন্য নিযুক্ত করাতে আমাদের একটি পরিচয় ফাংশন রয়েছে op। কিন্তু যদি= উচ্চতর অগ্রাধিকার আমরা আশা করব জাভা এটি ব্যাখ্যা করবে

(op = x) -> x;

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

তবে নিম্নলিখিতগুলিও ঠিক আছে (ধরুন tধরণের শ্রেণি / উদাহরণ ভেরিয়েবল int):

op = x -> t = x;

এটি সংকলন করে, এবং ফাংশনটি প্রয়োগ করা হলে অপারেন্ডের মান নির্ধারণ করে t এবং এটি প্রদান করে।

এর অর্থ অ্যাসাইনমেন্টের চেয়ে তীরের উচ্চতর প্রাধান্য নেই t = x। অন্যথায় এটি ব্যাখ্যা করা হত

op = ( x -> t ) = x

এবং স্পষ্টতই, এটি ঘটে না।

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

Expression:
  LambdaExpression
  AssignmentExpression

LambdaExpression:
  LambdaParameters -> LambdaBody

...

LambdaBody:
  Expression
  Block

সুতরাং ল্যাম্বডা দেহের ডান দিকটি আমাদের কাছে ফিরে আসে Expression , যার অর্থ আমরা এর ভিতরে একটি (উচ্চতর অগ্রাধিকার) ল্যাম্বডা থাকতে পারি, বা এটিতে একটি (উচ্চ অগ্রাধিকার) নিয়োগ থাকতে পারি। "উচ্চ অগ্রাধিকার" দ্বারা আমি যা বোঝাতে চাইছি তা হ'ল প্রোডাকশন বিধিগুলির মধ্য দিয়ে আপনি যত গভীরভাবে যান, পূর্বের অভিব্যক্তিটি মূল্যায়ন করা হবে।

অ্যাসাইনমেন্ট অপারেটরের ক্ষেত্রেও এটি একই:

AssignmentExpression:
  ConditionalExpression
  Assignment

Assignment:
  LeftHandSide AssignmentOperator Expression

আবার, অ্যাসাইনমেন্টের ডান দিকটি আমাদের দিকে ফিরে ছুড়ে দেয় Expression , যাতে আমরা সেখানে ল্যাম্বডা এক্সপ্রেশন বা একটি অ্যাসাইনমেন্ট রাখতে পারি।

সুতরাং জেএলএস পাঠ্যের উপর নির্ভর করার পরিবর্তে ব্যাকরণ আমাদের পরিস্থিতিটির একটি সুস্পষ্ট সংজ্ঞা দেয়।

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