ステートメントが機能しない場合は1行


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

私はこのようなことを考えていましたか?

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

しかし、それは機能しません。Rubyにはあります||=が、その使い方はわかりません。


どのラインが機能していないのか(または両方とも機能していないのか)は不明です
ymoreau

回答:


399

ifから削除if @item.rigged ? "Yes" : "No"

三項演算子の形式 condition ? if_true : if_false


1
条件が「?」で終わる場合 それを落とすことは可能ですか?つまり、条件が@ customer.sales.presentの場合はどうでしょうか。「?」を落とせますか?...心配しないでください。私が持っているコードを見つけてテストしました。答えは「いいえ」です
ジェイ・キリーン

@JayKilleenあなたは正しいです。Rubyは巧妙なトリックのすべてですが、それはその巧妙なものです(:
Nikita Rybak、2015年

1
@NikitaRybak s/that/not that :)
オースティン

180

Rubyでは、条件と式の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

Rubyには条件演算子もありますが、それは完全に不要です。条件演算子はCで必要です。これは演算子であるためです。C ifはステートメントであり、値を返すことができないため、値を返したい場合は、値を返すことができるものを使用する必要があります。また、Cで値を返すことができるのは関数と演算子ifだけです。Cで関数を作成することは不可能であるため、演算子が必要です。

ただし、Rubyではif式です。実際、すべてがRubyの式なので、すでに値を返すことできます。でもへの条件演算子のための必要はありませんが存在は、、ましてやそれを使用するには。

ところで、次のように、最後に疑問符が付いた質問をするために使用されるメソッドに名前を付けるのが慣例です。

@item.rigged?

これは、Rubyでの条件演算子の使用に関する別の問題を示しています。

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

互いに近くにある複数の疑問符で読むのは簡単ではありません。


74

1行の場合:

<statement> if <condition>

あなたの場合:

"Yes" if @item.rigged

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

14
または"No" unless @item.rigged、防止!
Veger

このソリューションはnil'Yes'if item.riggedがtrueの代わりに返されるという点で異なります。nil条件が満たされない場合にステートメントが戻る場合のifまたはexceptの単一行。
ペルマイスター

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
犬これが最良の答えです。私は、3つの方法すべてを簡潔に対照しているのが好きです。ありがとう!
MrVocabulary 2018

7

シェルとCの1行構成の両方が機能します(ruby 1.9.3p429):

# 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番目の例は慣用的なルビです
sekmo


2

簡単にするために、nilを使用できる場合にデフォルトの値を設定する必要がある場合:

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

1

使用できます----

(@ item.rigged)?"はい・いいえ"

@ item.riggedがtrueの場合は「はい」を返し、それ以外の場合は「いいえ」を返します

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.