Как я могу использовать троичный оператор с несколькими значениями?

#ruby

#ruby

Вопрос:

Привет, я пытаюсь понять, почему мой код, кажется, работает в форме if / else, но, похоже, не работает с троичным оператором.

Для истинного значения я хочу, чтобы оно уменьшало баланс и помещало мое сообщение.

Ниже приведено то, что я пробовал:

 # With ternary operator. This doesn't work:

def withdraw(pin_number, amount)
    puts pin_number == pin ? @balance -= amount "Withdrew #{amount}. New 
    balance $#{@balance}." : puts pin_error
end

# With if/else statement. This does work:

def withdraw(pin_number,amount)
    if pin_number == @pin
      @balance -= amount
      puts "Withdrew #{amount}."
    else
      puts pin_error
    end
end

~~
  

Комментарии:

1. if-else Вариант выглядит просто отлично для меня. Могу я спросить, почему вы хотите использовать троичный оператор вместо этого?

2. Это в основном для моего понимания. Я довольно новичок в ruby и хотел разобраться в троичном операторе и в том, как его использовать с несколькими значениями. Есть идеи, почему тернарный оператор, похоже, не работает? Это потому, что в «истинной» части есть два значения?

3. Точно, вы должны разделять выражения с помощью ; и заключать их в круглые скобки, т. е. (@balance -= amount ; puts "...") . Но это затрудняет чтение вашего кода, и его следует избегать. О, и в вашем троичном примере есть лишнее puts .

4. @Stefan Спасибо за ответ и примечание относительно дополнительных puts !

Ответ №1:

Поскольку троичный оператор является именно этим (operator), вы не можете разделить его на несколько инструкций.

Однако блоки позволяют «сквошить» несколько инструкций в одно выражение.

 def my_withdraw(pin_number,amount)
  puts (
    pin_number == @pin ?
    begin
      @balance -= amount
      "Withdrew #{amount}."
    end :
    pin_error
  )
end
  

Конечно, это совершенно неразборчиво, и я бы никогда не рекомендовал вам использовать такой синтаксис в реальном мире. Но ради науки, почему бы и нет.

Комментарии:

1. Я согласен с вами, и в реальной жизни я бы предпочел вариант if / else. Но это делает это более понятным для меня. Спасибо!

Ответ №2:

; используется, чтобы сообщить Ruby, что это два разных оператора / выражения / строки, если вы помещаете два выражения в одну строку.

Итак, ваш код будет

 def withdraw(pin_number, amount)
    puts pin_number == pin ? ( @balance -= amount;  "Withdrew #{amount}.  New 
    balance $#{@balance}." ) : puts pin_error
 end