Uma linha se a instrução não estiver funcionando


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

Eu estava pensando em algo assim?

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

Mas isso não funciona. Ruby tem o, ||=mas nem tenho certeza de como usá-lo.


Não está claro qual a linha não está funcionando (ou é ambos?)
ymoreau

Respostas:


399

Remover ifdeif @item.rigged ? "Yes" : "No"

O operador ternário tem forma condition ? if_true : if_false


1
Se sua condição termina em um '?' é possível largar? Ou seja, se a condição for @ customer.sales.present? você pode largar o '?'? ... não se preocupe. Encontrei algum código que eu tinha e testei. A resposta é "não"
Jay Killeen

@JayKilleen Você está correto. Ruby tem tudo a ver com truques inteligentes, mas é tão inteligente (:
Nikita Rybak 23/01

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

180

No Ruby, a condição e a thenparte de uma ifexpressão devem ser separadas por um separador de expressão ( ;ou seja, uma nova linha) ou pela thenpalavra - chave.

Então, tudo isso funcionaria:

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

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

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

Há também um operador condicional no Ruby, mas isso é completamente desnecessário. O operador condicional é necessário em C, porque é um operador: em C, ifé uma instrução e, portanto, não pode retornar um valor; portanto, se você deseja retornar um valor, precisa usar algo que possa retornar um valor. E as únicas coisas em C que podem retornar um valor são funções e operadores e, como é impossível fazer ifuma função em C, você precisa de um operador.

Em Ruby, no entanto, ifé uma expressão. De fato, tudo é uma expressão em Ruby, portanto, ele pode retornar um valor. Não é necessário que o operador condicional exista , muito menos usá-lo.

BTW: é usual nomear métodos que são usados ​​para fazer uma pergunta com um ponto de interrogação no final, assim:

@item.rigged?

Isso mostra outro problema com o uso do operador condicional no Ruby:

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

É simplesmente difícil de ler com os vários pontos de interrogação que se aproximam.


74

Uma linha se:

<statement> if <condition>

Seu caso:

"Yes" if @item.rigged

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

14
Ou "No" unless @item.riggedpara impedir o!
Veger 13/02/2015

Esta solução é diferente, pois retorna em nilvez de 'Yes'se item.riggedfor verdadeira. Instruções de linha única se ou a menos que retornem nilse a condição não for atendida.
The Pellmeister

23

Pelo que eu sei

3 one-liners

  1. a = 10 if <condition>

exemplo:

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

exemplo:

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

exemplo:

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

Espero que ajude.


2
Cão Essa é a melhor resposta - eu amo o quão sucintamente isso contrasta as três maneiras. Obrigado!
MrVocabulary 23/09

7

As construções de linha única shell e C funcionam (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"

apenas o segundo exemplo é idiomática rubi
sekmo

7

se outra condição puder ser coberta com operador ternário

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

2

Por uma questão de simplicidade, se você precisar usar como padrão algum valor, se nulo, poderá usar:

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

1

Você pode usar ----

(@ item.rigged)? "Sim não"

Se @ item.rigged for true, ele retornará 'Yes'; caso contrário, retornará 'No'

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.