Рубиновое многострочное тернарное выражение?

Я пытаюсь преобразовать что-то вроде этого:

if condition?
   expression1 line 1
   expression1 line 2
   expression1 line 3
else 
   expression2 line 1
end

к тройному, мой вопрос: как вы помещаете несколько строк в одно выражение в одной строке? Вы разделяете точкой с запятой, как в java? Как это?

condition? expression1 line 1; expression1 line 2; expression1 line 3 : expression2

Ответ 1

Вы должны заключить выражения в круглые скобки:

condition ? (expression1 line 1; expression1 line 2; expression1 line 3) : expression2

Вы должны помнить, что это уменьшает читаемость вашего кода. Вероятнее всего, вам лучше использовать оператор if/else для улучшения удобочитаемости. Один ресурс, который мне нравится использовать при просмотре моего кода ruby, - это руководство сообщества. Как говорится во вступительном параграфе:

Это руководство по стилю Ruby рекомендует лучшие практики, чтобы в реальном мире Программисты Ruby могут писать код, который может поддерживаться другими реальных программистов Ruby.

Надеюсь, что это поможет

Ответ 2

In Ruby, it is always possible to replace newlines with semicolons, so you can, in fact, write your entire program in one single long giant line. Whether or not that is good for readability and maintainability, I will leave that up to you. (Note: you will sometimes have to insert parentheses for grouping in case of precedence mismatch.) Here is how you can write your conditional expression in a single line: if condition? then expression1 line 1; expression1 line 2; expression1 line 3 else expression2 line 1 end

Ответ 3

Вы можете выразить несколько строк по нескольким строкам:

condition ?
  expression 1 :
  expression 2

И да, вам нужно будет использовать точки с запятой для нескольких выражений (и скобки не пострадают).

Пожалуйста, не делайте этого. Придерживайтесь инструкций if.

Ответ 4

Тернарный оператор требует одного блока инструкций. Это означает, что вы либо группируете инструкции в использовании скобки

condition = true
condition ? (puts("this"); puts("is"); puts("true")) : puts("this is false")

или в блоке begin/end.

condition = true
condition ? begin puts("this"); puts("is"); puts("true") end : puts("this is false")

Тот факт, что нет простого, чистого способа достижения результата, должен сообщить вам, что тернарный оператор на самом деле не предназначен для нескольких операторов.;)

Не пытайтесь использовать его в этом случае. Используйте стандартный if/else.