Una riga se l'istruzione non funziona


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

Stavo pensando a qualcosa del genere?

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

Ma non funziona Ruby ha il ||=ma non sono nemmeno sicuro di come usare quella cosa.


Non è chiaro quale linea non funziona (o è entrambe le cose?)
ymoreau

Risposte:


401

Rimuovi ifdaif @item.rigged ? "Yes" : "No"

L'operatore ternario ha forma condition ? if_true : if_false


1
Se la tua condizione termina con un '?' è possibile lasciarlo cadere? Vale a dire se la condizione è @ customer.sales.present? puoi rilasciare il '?'? ... non ti preoccupare. Ho trovato del codice che avevo e l'ho provato. La risposta è "no"
Jay Killeen,

@JayKilleen Hai ragione. Ruby parla di trucchi intelligenti, ma è così intelligente (:
Nikita Rybak,

1
@NikitaRybak s/that/not that :)
Austin,

180

In Ruby, la condizione e la thenparte di ifun'espressione devono essere separate da un separatore di espressioni (ovvero da ;una nuova riga) o dalla thenparola chiave.

Quindi, tutti questi funzionerebbero:

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

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

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

C'è anche un operatore condizionale in Ruby, ma è del tutto inutile. L'operatore condizionale è necessario in C, perché è un operatore: in C ifè un'istruzione e quindi non può restituire un valore, quindi se si desidera restituire un valore, è necessario utilizzare qualcosa che può restituire un valore. E le uniche cose in C che possono restituire un valore sono funzioni e operatori, e poiché è impossibile eseguire ifuna funzione in C, è necessario un operatore.

In Ruby, tuttavia, ifè un'espressione. In realtà, tutto è un'espressione in Ruby, quindi può già restituire un valore. Non è necessario che l'operatore condizionale esista , per non parlare dell'uso.

A proposito: è consuetudine nominare metodi che vengono utilizzati per porre una domanda con un punto interrogativo alla fine, in questo modo:

@item.rigged?

Questo mostra un altro problema con l'utilizzo dell'operatore condizionale in Ruby:

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

È semplicemente difficile leggere con i molteplici punti interrogativi vicini l'uno all'altro.


74

Una riga se:

<statement> if <condition>

Il tuo caso:

"Yes" if @item.rigged

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

14
O "No" unless @item.riggedper prevenire il!
Veger

Questa soluzione è diversa in quanto restituisce nilinvece che 'Yes'se item.riggedè vera. Se vengono restituite le istruzioni a riga singola se o meno nilse la condizione non è soddisfatta.
The Pellmeister,

23

Da quello che so

3 one-liner

  1. a = 10 if <condition>

esempio:

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

esempio:

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

esempio:

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

Spero possa essere d'aiuto.


2
Cane Questa è la risposta migliore - Adoro quanto in modo succinto contrapponga tutti e tre i modi. Grazie!
Mr Vocabulary,

7

Entrambi i costrutti a una linea di shell e C funzionano (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"

solo il secondo esempio è rubino idiomatico
sekmo

7

se altrimenti la condizione può essere coperta con l'operatore ternario

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

2

Per semplicità, se è necessario impostare un valore predefinito se nullo, è possibile utilizzare:

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

1

Puoi usare ----

(@ item.rigged)? "Si No"

Se @ item.rigged è vero, restituirà 'Sì' altrimenti restituirà 'No'

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.