#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