Имеет ли значение, если условное утверждение до или после выражения? - PullRequest
7 голосов
/ 21 декабря 2010

Извините, если это глупый вопрос, но я парень на C #, шаривающий в рубинеесть ли разница (даже небольшая) между этим и этим:

if 1 = 1 do_something(with params)

или это то же самое написано для большей ясности?

Ответы [ 5 ]

6 голосов
/ 21 декабря 2010

Последний синтаксически недействителен. Вам нужно будет написать:

if 1==1 then do_something(with params) end

Однолинейные условные выражения должны всегда следовать. И да, есть разница . Попробуйте это:

bar1 = if foo1=14
  foo1*3
end
#=> 42

bar2 = foo2*3 if foo2=14
#=> NameError: undefined local variable or method `foo2' for main:Object

В последнем случае Ruby видит присвоение после ссылки и поэтому foo2 рассматривает как метод вместо локальной переменной. Эта проблема возникает только тогда, когда:

  • Вы намеренно используете присвоение (не проверяя на равенство) в условном выражении, а
  • Впервые (с точки зрения исходного порядка) эта переменная была назначена в области видимости.
4 голосов
/ 21 декабря 2010

Запустите irb и запустите свой код, и вы узнаете:

  • 1 = 1 - синтаксическая ошибка, измените на 1 == 1.
  • Вы можете 'Вы не можете иметь выражение сразу после if 1==1, вам нужно будет добавить : или then и закрыть с помощью end.

Трейлинг if действительно должен использоваться толькодля отдельных выражений, и вы не можете добавить else.Они называются модификаторами операторов и являются просто синтаксическим сахаром для лучшей читаемости.Я не полностью против них, но рекомендую использовать их экономно.

2 голосов
/ 21 декабря 2010

Вы можете использовать любой из них, но если вы поместите оператор if первым, вам нужно закрыть условие с помощью 'end'.

2 голосов
/ 21 декабря 2010

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

http://rubylearning.com/satishtalim/ruby_syntactic_sugar.html

Примечание: для @Phrogz следующее НЕ одинаково!Пожалуйста, убедитесь, что вы не пытаетесь присвоить значение переменной вместо того, чтобы сравнивать переменную со значением!Кроме того, как упоминает Phrogz, порядок назначения переменных имеет большое значение ... подробнее см. В ответе @Phrogz!

if 1 = 1 then do_something(with params) end
if 1 == 1 then do_something(with params) end
0 голосов
/ 22 декабря 2010

Следующее оставляет foo как ноль.

foo = true unless defined?(foo) #Leaves foo as nil

Это потому, что Ruby создает переменную foo и присваивает ей значение nil, когда она читает (я думаю, что синтаксический анализ) бит foo = trueи затем, когда он читает (выполняя, я думаю) unless defined?(foo), он говорит, что foo определен (он определен как ноль), и, следовательно, не выполняет часть foo = true.

Если бы вы сделали

unless defined?(foo)
  foo = true
end

, вы бы получили foo в значении true.

Я добавил это в О каких рубиновых ошибках следует предупредить новичка? , потому что кто-то запутался в этом здесь .

Так что да, в некоторых обстоятельствах это может иметь значение.

...