2009-03-10 6 views
8

Я нашел три способа, чтобы написать такое же условие в Ruby:Как писать «если» без использования «то» или «конец» в Рубине

#1 
if 1==1 
    puts "true" 
end 

#2 
puts "true" if 1==1 

#3 
if 1==1 then puts "true" end 

Почему я не могу это сделать?

#4 
if 1==1 puts "true" 

Я не понимаю:

  1. Почему затем и конец необходимы в # 3, и,
  2. Почему мне нужно изменить порядок, чтобы получить # 2 Работа.

Заявление # 4 кажется самым естественным способом написать это. Я не понимаю, почему это невозможно.

ответ

19

Синтаксис «if x then y end» предназначен для многострочных условных обозначений, а форма «y if x» предназначена для кратких однострочных условных операторов. В первом случае необходимо указать then, чтобы сообщить Ruby, что условие завершено (поскольку Ruby не требует таких парсов, как C), и end необходимо сообщить Ruby, что весь блок if закончился (так как это может быть несколько строк).

Вы можете заменить then точкой с запятой, так как конец строки также сигнализирует о завершении условия. Вы не можете избавиться от end с многострочным if. Либо используйте вторую форму или тернарный оператор, если вы хотите получить лаконичный лайнер.

Например, предположим, что

x = true 

следующий будет оценить истинное, и вернуть у

x ? y : 
=> y 

также, это будет оценивать ложные и возвращают ничего

!x ? y : 
=> 

добавить термин после «:» для случая else

!x ? y : z 
=> z 
+0

«так как Ruby не требует таких парсов, как C» - я забыл об этом. Хорошо, имеет смысл, почему «тогда» необходимо. Не знал о точке с запятой - выглядит немного странно, но это работает. Очень полезно. Благодарю. – 2009-03-10 18:23:20

+0

+1 для точки с запятой. –

4

Дело в том, что оба способа на самом деле естественный способ думать:

, если это верно, то сделать что-то

сделать что-то, если это правда

см? Таким образом Ruby пытается приблизиться к синтаксису английского языка. конец просто необходим для завершения блока, а во второй версии блок уже закрыт , если.

На самом деле ответить на ваш вопрос, я думаю, что нет никаких шансов получить тогда и конца удален. Помните Паскаль/Дельфы? У вас есть , а затем. Это типично только для языков C-стиля, чтобы не иметь его.

0

Как насчет использования двоеточия вместо этого? http://www.java2s.com/Code/Ruby/Statement/layoutanifstatementisbyreplacingthethenwithacolon.htm

Существуют различные способы короткого замыкания, если вы хотите это сделать.

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

+0

Для чего это стоит, это использование двоеточия прошло с Ruby 1.9 - то же самое для тестов при проверке case. Смотрите Дэвид Блэк «Сын из 10 вещей, о которых нужно знать в Ruby 1.9» – Telemachus