এক লাইন যদি বিবৃতি কাজ না করে


191
<%if @item.rigged %>Yes<%else%>No<%end%>

আমি কি এমন কিছু ভাবছিলাম?

if @item.rigged ? "Yes" : "No" 

কিন্তু এটি কাজ করে না। রুবির রয়েছে ||=তবে আমি কীভাবে জিনিসটি ব্যবহার করব তাও নিশ্চিত নই।


এটি স্পষ্ট নয় যে কোন লাইনটি কাজ করছে না (বা এটি উভয়ই?)
ymoreau

উত্তর:


399

ifথেকে সরানif @item.rigged ? "Yes" : "No"

টার্নারি অপারেটরের ফর্ম রয়েছে condition ? if_true : if_false


1
আপনি যদি শর্তটি একটি 'শেষ হয়?' এটা কি ফেলে দেওয়া সম্ভব? অর্থাৎ শর্তটি যদি @ ગ્રાહার.সলেস.প্রেসেন্ট হয়? আপনি 'ড্রপ করতে পারেন?' ... চিন্তা করবেন না। আমার কাছে কিছু কোড ছিল এবং এটি পরীক্ষা করে tested উত্তরটি 'না'
জেই কিলিন

@ জয়কিলেন আপনি সঠিক আছেন রুবি চতুর কৌশল সম্পর্কে সমস্ত, তবে এটি সেই চালাক (:
নিকিতা রাইবাক

1
@ নিকিতাআরবাক s/that/not that :)
অস্টিন

180

রুবিতে শর্ত এবং অভিব্যক্তির thenঅংশটি ifঅবশ্যই একটি এক্সপ্রেশন বিভাজক (অর্থাত্ ;একটি নতুন লাইন) বা মূলশব্দ দ্বারা পৃথক করতে হবে then

সুতরাং, এই সমস্ত কাজ করবে:

if @item.rigged then 'Yes' else 'No' end

if @item.rigged; 'Yes' else 'No' end

if @item.rigged
  'Yes' else 'No' end

রুবিতে শর্তসাপেক্ষ অপারেটরও রয়েছে তবে এটি সম্পূর্ণ অপ্রয়োজনীয়। শর্তসাপেক্ষ অপারেটর, সি প্রয়োজন কারণ এটি একটি অপারেটর হয়: সি, ifএকটি মান আর আসতে পারবেন না একটি বিবৃতি এবং এইভাবে, তাই আপনি যদি কোন মান ফিরিয়ে চান, আপনি কিছু যা ব্যবহার করতে হবে করতে একটি মান ফিরে। এবং সি এর কেবলমাত্র জিনিস যা কোনও মান ফেরত দিতে পারে সেগুলি হ'ল ফাংশন এবং অপারেটর এবং যেহেতু এটি ifসিতে কোনও ফাংশন করা অসম্ভব তাই আপনার একটি অপারেটরের প্রয়োজন।

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

বিটিডাব্লু: এমন পদ্ধতিগুলির নাম দেওয়ার প্রচলন রয়েছে যা শেষে একটি প্রশ্ন চিহ্ন সহ প্রশ্ন জিজ্ঞাসা করার জন্য ব্যবহৃত হয়:

@item.rigged?

এটি রুবিতে শর্তসাপেক্ষ অপারেটর ব্যবহার করে অন্য একটি সমস্যা দেখায়:

@item.rigged? ? 'Yes' : 'No'

একে অপরের নিকটে থাকা একাধিক প্রশ্ন চিহ্ন সহ এটি পড়া সহজ।


74

একটি লাইন যদি:

<statement> if <condition>

আপনার ক্ষেত্রে:

"Yes" if @item.rigged

"No" if !@item.rigged # or: "No" unless @item.rigged

14
অথবা "No" unless @item.riggedপ্রতিরোধ!
Veger

এই সমাধানটি পৃথক যে এটি যদি সত্য হয় nilপরিবর্তে ফিরে আসে । শর্তটি পূরণ না করা হলে বিবৃতিগুলি যদি না ফেরায় তবে একক লাইন । 'Yes'item.riggednil
পেলমিস্টার

23

আমি যা জানি তা থেকে

3 ওয়ান-লাইনার

  1. a = 10 if <condition>

উদাহরণ:

a = 10 if true # a = 10
b = 10 if false # b = nil
  1. a = 10 unless <condition>

উদাহরণ:

a = 10 unless false # a = 10
b = 10 unless true # b = nil
  1. a = <condition> ? <a> : <b>

উদাহরণ:

a = true ? 10 : 100 # a = 10
a = false ? 10 : 100 # a = 100

আমি আসা করি এটা সাহায্য করবে.


2
কুকুর এটি সর্বোত্তম উত্তর - আমি এটি তিনটি উপায়ে বিপরীতে কতটা সংক্ষিপ্তভাবে ভালবাসি তা পছন্দ করি। ধন্যবাদ!
মিঃ ভোকাবুলারি

7

শেল এবং সি উভয়ই এক-লাইন কাজ করে (রুবি ১.৯.৩.৪৪২৯):

# Shell format
irb(main):022:0> true && "Yes" || "No"
=> "Yes"
irb(main):023:0> false && "Yes" || "No"
=> "No"

# C format
irb(main):024:0> true ? "Yes" : "No"
=> "Yes"
irb(main):025:0> false ? "Yes" : "No"
=> "No"

কেবল দ্বিতীয় উদাহরণটি হ'ল
আইডোমেটিক


2

সরলতার জন্য, যদি আপনার কিছুটা মান ডিফল্ট করা প্রয়োজন হয় তবে আপনি যদি ব্যবহার করতে পারেন তবে:

@something.nil? = "No" || "Yes"

1

তুমি ব্যবহার করতে পার ----

(@ আইটেম.রিগড)? "হ্যাঁ না"

যদি @ আইটেম.রিগড সত্য হয় তবে এটি 'হ্যাঁ' ফিরবে অন্যথায় এটি 'না' ফেরত আসবে

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