আমি রুবিতে কীভাবে শর্তসাপেক্ষ অপারেটর (? :) ব্যবহার করব?


303

কীভাবে শর্তসাপেক্ষ অপারেটর (? :রুবিতে ) ব্যবহৃত হয়?

উদাহরণস্বরূপ, এটি কি সঠিক?

<% question = question.size > 20 ? question.question.slice(0, 20)+"..." : question.question %>

1
হ্যাঁ, আমি মনে করি তবে আমি এটিও মনে করি আপনি এটি সম্পাদন করতে পেরেছিলেন: question=question[0,20] যদি এটি ২০ এর চেয়ে কম হয় তবে এটি কোনও পরিবর্তন করবে না।
ডিজিএম

দৈর্ঘ্য 20 এর চেয়ে বেশি হলে আমারও '...' যুক্ত করা দরকার
মিথুন শ্রীধরণ

1
কোনও নির্দিষ্ট কলামে অন্ধভাবে একটি লাইন কেটে ফেলার বিষয়ে সতর্কতা অবলম্বন করুন। আপনি মাঝপথে কোনও শব্দ কাটা শেষ করতে পারেন তারপর এলিপসিস ('...') যুক্ত করুন, যা দেখতে খারাপ দেখাচ্ছে। পরিবর্তে, কাছাকাছি বিরামচিহ্ন বা সাদা স্থানের অক্ষর সন্ধান করুন এবং সেখানে ছাঁটাই করুন। কাছাকাছি আর কোনও ভাল ব্রেকিং পয়েন্ট না থাকলে কেবলমাত্র আপনার মাঝখানের শব্দটি কেটে ফেলা উচিত।
টিন ম্যান

উত্তর:


496

এটি টেরিনারি অপারেটর , এবং এটি সি এর মতো কাজ করে (প্রথম বন্ধনী প্রয়োজন হয় না)। এটি এমন একটি অভিব্যক্তি যা এর মতো কাজ করে:

if_this_is_a_true_value ? then_the_result_is_this : else_it_is_this

তবে রুবিতে ifএটিও একটি অভিব্যক্তি তাই: if a then b else c end===a ? b : c , অগ্রাধিকারের সমস্যাগুলি বাদে। দুটোই হ'ল এক্সপ্রেশন।

উদাহরণ:

puts (if 1 then 2 else 3 end) # => 2

puts 1 ? 2 : 3                # => 2

x = if 1 then 2 else 3 end
puts x                        # => 2

মনে রাখবেন যে প্রথম ক্ষেত্রে প্রথম বন্ধনী আবশ্যক (অন্যথায় রুবি বিভ্রান্ত হয়েছে কারণ এটি মনে করে এটি এটির puts if 1পরে কিছু অতিরিক্ত আবর্জনার সাথে রয়েছে), তবে শেষের ক্ষেত্রে তাদের প্রয়োজন নেই যেমনটি বলেছে যে সমস্যাটি উঠে না।

আপনি একাধিক লাইনে পাঠযোগ্যতার জন্য "দীর্ঘ-যদি" ফর্মটি ব্যবহার করতে পারেন:

question = if question.size > 20 then
  question.slice(0, 20) + "..."
else 
  question
end

0 রাখে? 2: 3 এছাড়াও ফলাফল 2 দেয়। কেন এমন?
এক্স_রোস্ট

18
@ এক্স_টাস্ট রুবীতে, একমাত্র মিথ্যা মানগুলি nilএবং false। সত্যিই খুব স্বাভাবিক নয়।
Kroltan

35
puts true ? "true" : "false"
=> "true"


puts false ? "true" : "false"
=> "false"

ছিটে কিন্তু এটি কি করে তা ব্যাখ্যা করে।
টিন ম্যান 23

4
প্রথম puts (true ? "true" : "false")বন্ধনী সহ ছোট সম্পাদনা । অন্যথায় অপারেশন ক্রম পরিষ্কার নয়। আমি যখন এটি প্রথম পড়ি তখন আমি বিভ্রান্ত হয়ে পড়েছিলাম যখন আমি এটি পড়েছিলাম (puts true) ? "true" : "false"তখন putsবুলিয়ানটি প্রত্যাশিত যা পরে স্ট্রিংয়ের মান হয়ে উঠল।
ফ্রেশিয়েবল

26

আপনার ইআরবি ব্যবহারের পরামর্শ দেয় আপনি কারাগারে রয়েছেন। যদি তা হয় তবে বিবেচনা করুনtruncate , একটি বিল্ট-ইন সহায়ক যা আপনার জন্য কাজ করবে:

<% question = truncate(question, :length=>30) %>

এটা অসাধারণ! আমি ঠিক কি করতে চাই !!
মিঠুন শ্রীধরণ

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

2
+1, তবে এর্ব অগত্যা রেলগুলি বোঝায় না (সিনাত্রা, স্ট্যান্ডেলোন ইআরবি, ইত্যাদি)।
ফক্স উইলসন

17

@ পিএসটি একটি দুর্দান্ত উত্তর দিয়েছে, তবে আমি উল্লেখ করতে চাই যে রুবীতে পার্ল এবং সি-এর বিপরীতে টেরিনারি অপারেটরকে এক লাইনে সিন্ট্যাক্টিক্যালি সঠিকভাবে লেখা হয়েছে, যেখানে আমরা এটি একাধিক লাইনে লিখতে পারি:

(true) ? 1 : 0

সাধারণত আপনি যদি এটি একাধিক লাইনে বিভক্ত করার চেষ্টা করেন তবে রুবি একটি ত্রুটি বাড়িয়ে তুলবে, তবে আপনি \একটি লাইনের শেষে লাইন-ধারাবাহিকতা চিহ্নটি ব্যবহার করতে পারেন এবং রুবি খুশি হবে:

(true)   \
  ? 1    \
  : 0

এটি একটি সাধারণ উদাহরণ, তবে কোডটি সুন্দরভাবে সাজিয়ে রাখার কারণে লম্বা লাইনগুলির সাথে কাজ করার সময় এটি খুব কার্যকর হতে পারে।

অপারেটরগুলিকে লাইনে শেষ রেখে লাইনের ধারাবাহিকতা অক্ষর ছাড়াই তিনটি ব্যবহার করা সম্ভব, তবে আমি এটি পছন্দ করি না বা এটি প্রস্তাব করি না:

(true) ?
  1 :
  0

আমি মনে করি যে শর্তসাপেক্ষ পরীক্ষা এবং / বা ফলাফল দীর্ঘতর হওয়ার কারণে কোডটি পড়া সত্যিই শক্ত হয়ে যায়।

আমি টার্নারি অপারেটরটি ব্যবহার না করার জন্য মন্তব্যগুলি পড়েছি কারণ এটি বিভ্রান্তিকর, তবে এটি কিছু ব্যবহার না করার এটি একটি খারাপ কারণ। একই যুক্তি অনুসারে আমাদের নিয়মিত প্রকাশ, ব্যাপ্তি অপারেটর (' ..' এবং আপাতদৃষ্টিতে অজানা "ফ্লিপ-ফ্লপ" প্রকরণ) ব্যবহার করা উচিত নয় । সঠিকভাবে ব্যবহার করার সময় এগুলি শক্তিশালী, তাই আমাদের এগুলি সঠিকভাবে ব্যবহার করতে শেখানো উচিত।


কেন আপনি চারদিকে বন্ধনী রেখেছেন true?

ওপির উদাহরণ বিবেচনা করুন:

<% question = question.size > 20 ? question.question.slice(0, 20)+"..." : question.question %>

শর্তসাপেক্ষ টেস্ট মোড়ানো এটিকে আরও পঠনযোগ্য করে তুলতে সহায়তা করে কারণ এটি পরীক্ষাটিকে দৃষ্টিভঙ্গি করে পৃথক করে:

<% question = (question.size > 20) ? question.question.slice(0, 20)+"..." : question.question %>

অবশ্যই, পুরো উদাহরণটিকে সাদা জায়গার কিছু যুক্তিসঙ্গত সংযোজন ব্যবহার করে আরও বেশি পঠনযোগ্য হতে পারে। এটি অনির্ধারিত তবে আপনি ধারণাটি পাবেন:

<% question = (question.size > 20) ? question.question.slice(0, 20) + "..." \
                                   : question.question 
%>

অথবা, আরও অজ্ঞাতসারে লিখিত:

<% question = if (question.size > 20)
                question.question.slice(0, 20) + "..."
              else 
                question.question 
              end
%>

তর্ক করা সহজ হবে যে পাঠযোগ্যতা question.questionখুব খারাপভাবে ভোগ করে।


1
যদি মাল্টি-লাইন হয় তবে কেন শুধু ... অন্য ... শেষ হলে ব্যবহার করবেন না?
ওয়েইন কনরাড

1
অনেক বছর পার্ল এবং সিতে কাজ করার কারণে? আমি পরিস্থিতি এবং অন্যটির তুলনায় একজন দৃশ্যত পরিষ্কার কিনা তা নির্ভর করে আমি ব্যবহার করি। কখনও কখনও যদি / অন্যথায় খুব ভার্বোস হয়, কখনও কখনও?: কুৎসিত হয়।
টিন ম্যান

1
@WayneConrad দ্য অন্তত একটি সমস্যা এই উত্তর ব্যাখ্যা যদি রয়েছে: stackoverflow.com/a/4252945/2597260 / একাধিক লাইন যদি ব্যবহার করার কয়েকটি উপায় তিন অপারেটর তুলনা করুন: gist.github.com/nedzadarek/0f9f99755d42bad10c30
Darek Nędza

কেন আপনি চারদিকে বন্ধনী রেখেছেন true?
জ্যাক

1
কারণ trueআসলে কি এমন একটি অভিব্যক্তি যা মূল্যায়ন করে trueবা এটির জন্য বসে false। এগুলি দৃশ্যতভাবে সীমিত করা ভাল, যেহেতু টের্নারি বিবৃতিগুলি চাক্ষুষ শব্দের মধ্যে দ্রুত রূপান্তর করতে পারে, পাঠযোগ্যতা হ্রাস করে যা রক্ষণাবেক্ষণকে প্রভাবিত করে।
টিন ম্যান 17

3

একটি সাধারণ উদাহরণ যেখানে অপারেটর প্লেয়ারের আইডি 1 কিনা তা পরীক্ষা করে এবং ফলাফলের উপর নির্ভর করে শত্রু আইডি সেট করে

player_id=1
....
player_id==1? enemy_id=2 : enemy_id=1
# => enemy=2

এবং আমি বিষয়টি সম্পর্কিত একটি পোস্ট পেয়েছি যা বেশ সহায়ক বলে মনে হচ্ছে।


4
না কেন enemy_id = player_id == 1 ? 2 : 1?
অ্যারন ব্লেনকুশ

1
@ অ্যারোনব্লেনকুশ মার্জিত ইনপুট জন্য ধন্যবাদ। আমি এখনও স্তম্ভের স্তরে আছি, সম্ভবত এটি কারণেই :)
দেবদূত্রে


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