কফিস্ক্রিপ্টে টের্নারি অপারেশন


318

আমার এটির মান নির্ধারণ করা দরকার aশর্তের উপর নির্ভর করে।

কফিস্ক্রিপ্ট দিয়ে এটি করার সবচেয়ে সংক্ষিপ্ততম উপায় কী?

যেমন এটি আমি জাভাস্ক্রিপ্টে এটি করব:

a = true  ? 5 : 10  # => a = 5
a = false ? 5 : 10  # => a = 10

120
<ran> আমি চাই যে কফি স্ক্রিপ্টটি কেবলমাত্র টেরিনারি অপারেটর সিনট্যাক্সকে সমর্থন করতে পারত, এটি if else then </
span

2
@ এজেপি আমার ধারণা, রুবির কাছে থাকলেও এই ত্রৈমাসিকী কফি কম রুবি-ইশ তৈরি করবে। কফির সাথে লক্ষ্যটি সর্বদা পঠনযোগ্যতা এবং মোটামুটি কোণগুলির বাইরে round
jcollum

37
@ জোকলুম সম্মত হয়েছে তবে যা আমি সবচেয়ে a = true ? 5 : 10আনসেটলিংয়ের মধ্যে পেয়েছি তা হ'ল বৈধ কফিসক্রিপ্ট, তবে এর পরিবর্তে (জাভাস্ক্রিপ্টে) এর অর্থ একটি ত্রৈমাসিক কাঠামো নয়: a = true ? true : {5:10}যা একটি খারাপ জিনিস হিসাবে পরিচিত ® a = false ? {5 : 10}তদতিরিক্ত (জাভাস্ক্রিপ্টে) হ'ল সমতুল্য: a = true ? false : {5:10} এটির মূল্য যার জন্য, আমি এটি ভাল বলে মনে করি না।
এজেপি

2
কফিস্ক্রিপ্টের জন্য যদি..ইন .. অন্যথায় বানানটি সর্বাধিক পক্ষে হতে পারে। দ্য ? একটি অস্তিত্ব অপারেটর হিসাবে অনেক কিছু বোঝায়: beast = yeti ? "bear"বা বেশ ভাল if yeti? then alert "It's a yeti!"ব্যবহার করে ?
পল অলিভার

3
if/then/elseইতোমধ্যে একটি অভিব্যক্তি হিসাবে আলাদা টেরিনারি অপারেটরটি কফিস্ক্রিপ্টে আসলেই প্রয়োজনীয় নয় এবং একই জিনিসটি করে। আপনি যদি সত্যিই এটি মিস করে থাকেন তবে এর পরিবর্তে আপনি সি বা জাভাস্ক্রিপ্ট সিনট্যাক্সের প্রয়োজনের তুলনায় অভ্যস্ত। যদি এটি যথেষ্ট পঠনযোগ্য না হয় এবং এটি কখনও কখনও ঘটে তবে কেবল বন্ধনীতে পুরো এক্সপ্রেশনটি মোড়ানো। অপারেটর ?আরও কার্যকর চেকগুলির জন্য রেহাই পেয়েছেন যা জাভাস্ক্রিপ্টে অনুপস্থিত রয়েছে, যেমনটি ইতিমধ্যে @ পলঅলাইভার বলেছিলেন। অস্তিত্বশীল অপারেটর সেরা।
স্কালে

উত্তর:


544

যেহেতু সবকিছুই একটি অভিব্যক্তি, এবং ফলস্বরূপ একটি মান হয়, আপনি কেবল ব্যবহার করতে পারেন if/else

a = if true then 5 else 10
a = if false then 5 else 10

আপনি এখানে অভিব্যক্তি উদাহরণ সম্পর্কে আরও দেখতে পারেন ।


8
আমার ধারণা, জাভাস্ক্রিপ্টের ডিফল্ট তৃতীয় সিনট্যাক্স সমর্থন না করার জন্য কফিস্ক্রিপ্টের কোনও কারণ আছে?
আগস্টিন রিডঞ্জার

41
কারণটি হ'ল "কম ক্রিপ্টিক" এবং কম স্বেচ্ছাচারী (যেমন, github.com/jashkenas/coffeescript/issues/11#issuecomment-97802 ) এর জন্য স্রষ্টার পছন্দ । [আমার 2 সেন্ট - আমি যখন স্বেচ্ছাচারিতাটি উপলব্ধি করতে পারি?:, আমি মনে করি if..then..elseযে একটি সংক্ষিপ্ত ভাব বলে মনে করা হচ্ছে এর প্রতিস্থাপন খুব ভার্জিক। এবং?: অনেকগুলি ভাষার মধ্যে জাভাস্ক্রিপ্টের মধ্যে একটি খুব আবদ্ধ স্ট্যান্ডার্ডের পরে কি?
এত কিছুর পরেও

1
আমি কফিস্ক্রিপ্ট লেখকের সাথে একমত, আমি সর্বদা ভেবেছিলাম ত্রৈমাসিক বাক্য গঠনটি কুৎসিত এবং অদম্য এএফ বলে মনে হয়। যদি আপনি if then elseএকই লাইনে ব্যবহার করতে পারেন তবে এটি করুন, এটি আরও স্পষ্টতা এবং কমনীয়তার জন্য 7 অতিরিক্ত অক্ষর।
জোশুয়া পিন্টার

স্বাদের উপর নির্ভর করে, তবে কীওয়ার্ডগুলির চেয়ে ->বেশি functionবা { }বেশি হিসাবে চিহ্নগুলির জন্য আমার দৃ strong় অগ্রাধিকার রয়েছে begin .. end, কারণ আমি শব্দ অনুপাতের একটি উচ্চ সংকেত দেখতে পছন্দ করি, যেখানে শব্দগুলি ফাংশন-নির্দিষ্ট যুক্তির জন্য সংরক্ষিত থাকে এবং অপারেশনাল লজিক বেশিরভাগই রিলিজড হয় প্রতীক।
মাহমুফ

খুব সাধারণ স্ট্যান্ডার্ড ক্রস-ল্যাঙ্গুয়েজ স্ট্রাকচারগুলি মুছে ফেলার পুরো ড্রাইভটি কেবলমাত্র রক্ষণাবেক্ষণ করছে এমন লোকদের স্ক্রু করে, বিশেষত যখন আপনি পাগের মতো অন্যান্য 'সহায়ক' জিনিসগুলিতে যুক্ত করেন ... আপনি যদি সমস্ত যুক্তির ক্রম এবং ভুতের প্রথম বন্ধনগুলি অনুমান করতে না পারেন ...
গ্রানিয়ন শাফটো


21

প্রায় কোনও ভাষায় এটি পরিবর্তে কাজ করা উচিত:

a = true  && 5 || 10
a = false && 5 || 10

38
এটি কাজ করে তবে এটি অনেক কম স্পষ্ট এবং এর জন্য আরও ভাল বাক্য গঠন আছে এমন কোনও ভাষায় এটি করার কোনও কারণ নেই।
ইব্রাহিম

10
এটি এমন অনেক ভাষায় সমান নয় যেখানে false0, নাল, অপরিজ্ঞাত, ... এবং এর মতো মানগুলির অন্তর্নিহিত রূপান্তর আছে
লর্ড অফ দ্য গু

12
@ ইব্রাহিম এটি শর্তসাপূর্ণ ত্রিভুজ হিসাবে কাজ করে তবেই যদি &&চিহ্নের অংশটি সত্য হয়, অন্যথায় এটি শেষ অংশটি ফিরিয়ে আনবে, যা শর্তসাপেক্ষ অঞ্চলগুলি কীভাবে কাজ করে না।
পেপकिन 88

স্পষ্টতই, পার্থক্য! :)
পিয়ের ভয়েসিন

সমস্ত উদাহরণগুলির মধ্যে এটিই আমি সবচেয়ে জটিল বলে মনে করি যে আমি যে ভাষাগুলিতে আসতে পারি তার মধ্যে ভেরিয়েবলগুলি কী হয় - বিশেষত কফিস্ক্রিপ্ট (বা রুবি) এর মতো একটি ল্যাঙ্গেজ যেখানে স্পেস সবসময় ফাঁকা থাকে না
টনি লে

12

কফিস্ক্রিপ্ট জাভাস্ক্রিপ্ট টেরিনারি অপারেটরকে সমর্থন করে না । এখানে কফিসিপি লেখকের কারণ :

আমি টার্নারি অপারেটরকে ঠিক পরের লোকের মতোই পছন্দ করি (সম্ভবত কিছুটা বেশি, আসলে) তবে সিনট্যাক্সটি তাদের ভাল করে তোলে না - তারা দুর্দান্ত কারণ তারা একটি / যদি অন্য কোনও লাইনে ফিট করতে পারে তবে অভিব্যক্তি।

তাদের বাক্য গঠনটি মুখস্থ করার জন্য রহস্যজনক যাদুগুলির আর একটি বিট, ভাষার কোনও কিছুর সাথে অ্যানালগ নেই। ফলাফলটি সমান if/elsesহওয়ায় আমি বরং সবসময় একইরকম থাকতাম (এবং সর্বদা একটি অভিব্যক্তিতে সংকলিত থাকি )।

সুতরাং, কফিস্ক্রিপ্টে, এমনকি মাল্টি-লাইন আইএফএস যখন উপযুক্ত হবে তখন টের্নারিগুলিতে সংকলন করবে, যেমনটি অন্য কোনও ধারা ছাড়াই বিবৃতি দেওয়া হবে:

if sunny   
  go_outside() 
else   
  read_a_book().

if sunny then go_outside() else read_a_book()

উভয়ই টেরেনারি হয়ে যায়, উভয়ই এক্সপ্রেশন হিসাবে ব্যবহার করা যেতে পারে। এটি সামঞ্জস্যপূর্ণ এবং শেখার জন্য কোনও নতুন সিনট্যাক্স নেই। সুতরাং, পরামর্শের জন্য ধন্যবাদ, তবে আমি এই টিকিটটি "wontfix" হিসাবে বন্ধ করছি।

দয়া করে গিথুব ইস্যুটি দেখুন: https://github.com/jashkenas/coffeescript/issues/11#issuecomment-97802


3

এটি বেশিরভাগ ক্ষেত্রে সত্যিকারের ব্যবহার হলে আপনি এটি দুটি বিবৃতিতেও লিখতে পারেন:

a = 5
a = 10 if false

অথবা আপনার আরও সম্ভাবনার প্রয়োজন হলে একটি স্যুইচ স্টেটমেন্ট ব্যবহার করুন:

a = switch x
  when true then 5
  when false then 10

একটি বুলিয়ান দিয়ে এটি বড় আকারের হতে পারে তবে আমি এটি খুব পঠনযোগ্য বলে মনে করি।


1

মাল্টলাইন সংস্করণ (উদাহরণস্বরূপ যদি প্রতিটি লাইনের পরে আপনাকে মন্তব্য যুক্ত করতে হবে):

a = if b # a depends on b
then 5   # b is true 
else 10  # b is false

0

CoffeeScriptকোন ternary অপারেটর আছে। ডক্স এটিই বলে।

আপনি এখনও একটি সিনট্যাক্স ব্যবহার করতে পারেন

a = true then 5 else 10

এটা অনেক পরিষ্কার।

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