если / если модификаторы против и / или - PullRequest
1 голос
/ 05 апреля 2011

Иногда вы хотите использовать модификатор if / unless, но условно исполняемая часть включает в себя локальную переменную, которая должна быть определена в условии.Например,

a = [1, 2, 3]
n = 3*(x**2) + 4*x + 5 if x = a[2]
m = 6*(y**2) + 7*y + 8 unless (y = a[0]).zero?

выдаст ошибку синтаксического анализа, поскольку x, y читается перед модификатором if / unless.Чтобы избежать этого, я думаю, что довольно часто (по крайней мере для меня) используется and вместо if и or вместо unless:

x = a[2] and n = 3*(x**2) + 4*x + 5
(y = a[0]).zero? or m = 6*(y**2) + 7*y + 8

ПомимоДело в том, что это не вызывает ошибку, есть ли разница?Есть ли побочные эффекты при этом?И есть ли лучший способ?

Ответы [ 3 ]

2 голосов
/ 05 апреля 2011

Альтернативы, которые я бы выбрал (и использовал), когда возникнет эта проблема:

if x=a[2]
  n = 3*(x**2) + 4*x + 5
end

if x=a[2] then n = 3*(x**2) + 4*x + 5 end

x=nil
n = 3*(x**2) + 4*x + 5 if x=a[2]
0 голосов
/ 22 апреля 2011

Я только что понял, что есть разница между

if x = something then f(x) end          (1)

и

x = something and f(x)                  (2)

Это когда something принимает значение false.В этом случае (1) возвращает nil, тогда как (2) возвращает false.

0 голосов
/ 05 апреля 2011

логическое или возвращает true, если одна из сторон оценивается как true ...

Вы уверены, что строки or и unless равны (может быть, строка or всегда имеет значение true, поскольку m = 6*(y**2) + 7*y + 8 равно true)?

EDIT:

Нет, я был неправ, взгляните на этот документ - кажется, вы ищете

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...