কীভাবে শর্তসাপেক্ষ অপারেটর (? :রুবিতে ) ব্যবহৃত হয়?
উদাহরণস্বরূপ, এটি কি সঠিক?
<% question = question.size > 20 ? question.question.slice(0, 20)+"..." : question.question %>
কীভাবে শর্তসাপেক্ষ অপারেটর (? :রুবিতে ) ব্যবহৃত হয়?
উদাহরণস্বরূপ, এটি কি সঠিক?
<% question = question.size > 20 ? question.question.slice(0, 20)+"..." : question.question %>
উত্তর:
এটি টেরিনারি অপারেটর , এবং এটি সি এর মতো কাজ করে (প্রথম বন্ধনী প্রয়োজন হয় না)। এটি এমন একটি অভিব্যক্তি যা এর মতো কাজ করে:
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
nilএবং false। সত্যিই খুব স্বাভাবিক নয়।
puts true ? "true" : "false"
=> "true"
puts false ? "true" : "false"
=> "false"
puts (true ? "true" : "false")বন্ধনী সহ ছোট সম্পাদনা । অন্যথায় অপারেশন ক্রম পরিষ্কার নয়। আমি যখন এটি প্রথম পড়ি তখন আমি বিভ্রান্ত হয়ে পড়েছিলাম যখন আমি এটি পড়েছিলাম (puts true) ? "true" : "false"তখন putsবুলিয়ানটি প্রত্যাশিত যা পরে স্ট্রিংয়ের মান হয়ে উঠল।
আপনার ইআরবি ব্যবহারের পরামর্শ দেয় আপনি কারাগারে রয়েছেন। যদি তা হয় তবে বিবেচনা করুনtruncate , একটি বিল্ট-ইন সহায়ক যা আপনার জন্য কাজ করবে:
<% question = truncate(question, :length=>30) %>
@ পিএসটি একটি দুর্দান্ত উত্তর দিয়েছে, তবে আমি উল্লেখ করতে চাই যে রুবীতে পার্ল এবং সি-এর বিপরীতে টেরিনারি অপারেটরকে এক লাইনে সিন্ট্যাক্টিক্যালি সঠিকভাবে লেখা হয়েছে, যেখানে আমরা এটি একাধিক লাইনে লিখতে পারি:
(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খুব খারাপভাবে ভোগ করে।
true?
trueআসলে কি এমন একটি অভিব্যক্তি যা মূল্যায়ন করে trueবা এটির জন্য বসে false। এগুলি দৃশ্যতভাবে সীমিত করা ভাল, যেহেতু টের্নারি বিবৃতিগুলি চাক্ষুষ শব্দের মধ্যে দ্রুত রূপান্তর করতে পারে, পাঠযোগ্যতা হ্রাস করে যা রক্ষণাবেক্ষণকে প্রভাবিত করে।
একটি সাধারণ উদাহরণ যেখানে অপারেটর প্লেয়ারের আইডি 1 কিনা তা পরীক্ষা করে এবং ফলাফলের উপর নির্ভর করে শত্রু আইডি সেট করে
player_id=1
....
player_id==1? enemy_id=2 : enemy_id=1
# => enemy=2
এবং আমি বিষয়টি সম্পর্কিত একটি পোস্ট পেয়েছি যা বেশ সহায়ক বলে মনে হচ্ছে।
enemy_id = player_id == 1 ? 2 : 1?
কোডটি condition ? statement_A : statement_Bসমান
if condition == true
statement_A
else
statement_B
end
সহজ রাস্তা:
param_a = 1
param_b = 2
result = param_a === param_b ? 'Same!' : 'Not same!'
যেহেতু param_aসমান নয় param_bতখন resultএর মান হবেNot same!
question=question[0,20]যদি এটি ২০ এর চেয়ে কম হয় তবে এটি কোনও পরিবর্তন করবে না।