2015-01-15 5 views
10

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

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 
+3

Это будет очень неясно, если кто-либо еще прочитает код позже - есть ли причина, по которой это должно быть троянец? – mcfinnigan

+3

Почему, по вашему мнению, тройной оператор лучше в этом случае? –

+1

Кажется, что пришло время подумать о том, чтобы использовать другую конструкцию, например if/else. –

ответ

9

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

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

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

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

Надеется, что это помогает

+0

Несмотря на то, что он ставит цель поставить все на одной линии, это ломает читаемость и ремонтопригодность, которые имеют большее значение. Сохранение пространства, чтобы пожертвовать другими, - это верный путь к плохому дню в обзоре кода. –

+0

@theTinMan согласился. Я бы предпочел бы оператор 'if' /' else'. – ptierno

+0

Скажите так в ответе. Предоставление решения, которое работает, но не является правильным способом сделать это, на самом деле не является хорошим ответом, поскольку оно распространяет предположение, что это хорошая практика. Вместо этого, правильно указывать правильный путь. Я думаю об этом так: хочу ли я, чтобы кто-то из моей команды писал такой код, что * I *, возможно, придется поддерживать? –

7

Вы можете выразить тройные через нескольких строк этого:

condition ? 
    expression 1 : 
    expression 2 

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

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

5

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

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

или в начале/конце блока.

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

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

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

18
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
+0

Красиво написано. :-) –