semnul întrebării și două puncte – if else în ruby (Programare, Ruby Pe Șine, Ruby, Operator Ternar)

u19964 a intrebat.

Bună ziua Am o întrebare despre ruby on rails

Se pare că am o declarație de genul acesta:

def sort_column
    Product.column_names.include?(params[:sort]) ? params[:sort] : "name"
end

Din ce am citit, se spune că această metodă sortează coloana în funcție de params[:sort] iar dacă nu există params produsele vor fi sortate după „nume”. Cu toate acestea, nu înțeleg modul în care este scrisă această declarație, mai ales al doilea „?”. Poate cineva să îmi explice?

Comentarii

  • Mulțumesc, am găsit asta: ro.wikipedia.org/wiki/%3F: –  > Por u19964.
  • Trebuie să recunosc, îmi place destul de mult cum Ruby îmi permite să înlănțuiesc totul în lanț, deși arată ciudat să văd un bloc do-end în care capătul are o metodă atașată la el. –  > Por Ron.
5 răspunsuri
Sergio Tulentsev

Acesta este codul tău, rearanjat pentru o înțelegere mai ușoară.

def sort_column
  cond = Product.column_names.include?(params[:sort]) 
  cond ? params[:sort] : "name"
  #  it's equivalent to this
  # if cond
  #   params[:sort]
  # else
  #   'name'
  # end
end

Primul semn de întrebare face parte din numele unei metode, al doilea – parte a operatorului ternar (despre care ar trebui să citiți).

Matheus Moreira

?: este un operator ternar care este prezent în multe limbi. Acesta are următoarea sintaxă:

expression ? value_if_true : value_if_false

În Ruby, este o versiune mai scurtă a acestuia:

if expression
  value_if_true
else
  value_if_false
end

Comentarii

  • Mai important, este o versiune scurtă a lui This: if expression then value_if_true else value_if_false end. IOW: puteți scrie un if-expresie pe o singură linie, dacă vreți, nu trebuie să folosiți operatorul condițional oribil de criptat și ilizibil. –  > Por Jörg W Mittag.
  • @JörgWMittag, +1 pentru inline ifelse. Face codul foarte ușor de citit și strălucește cu adevărat în comparație cu lucruri precum question? ? true : false. Întotdeauna îl folosesc, cu excepția cazului în care linia devine prea mult lungă. –  > Por Matheus Moreira.
LanceH

Această replică se traduce aproximativ prin:

if Product.column_names.include?(params[:sort])
    params[:sort]
else
    "name"
end

? : este un operator ternar; o prescurtare pentru un scurt if-else.

Comentarii

  • Este mai puțin o prescurtare decât o soluție pentru C și alte limbaje în care if este o declarație și nu o expresie. Din punct de vedere tehnic, nu există niciun motiv pentru a-l avea în Ruby, după cum arată Python și Lua. –  > Por Michael Kohl.
André Medeiros
Product.column_names.include?(params[:sort]) ? params[:sort] : "name"

Primul semn de întrebare face parte din numele metodei: include?.

Al doilea semn de întrebare și două puncte fac parte din operandul ternar: (if this is true) ? (do this) : (else, do that).

Aceasta înseamnă că, dacă Product.column_names conține params[:sort], se va returna params[:sort]. În caz contrar, va returna "name".

Cris R

Trebuie să fim atenți la partea de expresie care urmează să fie evaluată în operatorul ternar, de exemplu atunci când folosim and față de &&, iată ce se poate întâmpla:

2.6.2 :014 > a = false
 => false
2.6.2 :015 > b = true
 => true
2.6.2 :016 > a and b ? 'first' : 'second'
 => false
2.6.2 :017 > a && b ? 'first' : 'second'
 => "second"
2.6.2 :018 > (a and b) ? 'first' : 'second'
 => "second"