Как написать 'if' без использования 'then' или 'end' в Ruby - PullRequest
8 голосов
/ 10 марта 2009

Я нашел три способа написать одно и то же условие в 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. Почему * # 1010 *, тогда и end необходимы в # 3, и,
  2. Почему мне нужно изменить порядок, чтобы заставить # 2 работать.

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

Ответы [ 3 ]

19 голосов
/ 10 марта 2009

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

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

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

x = true

следующее вычислит true и вернет y

x ? y :
=> y

аналогично, это оценивает ложь и ничего не возвращает

!x ? y :
=> 

добавить термин после ':' для остального случая

!x ? y : z
=> z
4 голосов
/ 10 марта 2009

Дело в том, что оба способа на самом деле являются естественным способом мышления:

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

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

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

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

0 голосов
/ 10 марта 2009

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

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

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

...