ruby, как лучше всего настроить: bar if foo vs foo и bar

как лучше всего проверить условие и запустить метод в Ruby? какой из них самый читаемый?

бар, если фу

or

фу и бар


person ajahongir    schedule 14.08.2014    source источник
comment
зависит от ситуации. Не существует одного лучшего способа. Они одинаково быстрые. Первый немного более читаем IMO.   -  person John Dvorak    schedule 14.08.2014
comment
Я бы предпочел первое.   -  person konsolebox    schedule 14.08.2014
comment
первый более удобочитаем, но на самом деле зависит - проголосовали за закрытие как в первую очередь основанный на мнении   -  person dax    schedule 14.08.2014
comment
А как насчет foo && bar?   -  person Darek Nędza    schedule 14.08.2014


Ответы (2)


Я бы использовал один над другим в зависимости от ситуации.

Если я заинтересован в запуске метода в зависимости от выполненного условия (иначе условие не имеет побочного эффекта):

do_something if this_condition_is_true

Если я заинтересован в запуске метода только в том случае, если другой метод завершился успешно (он же оба метода имеют побочные эффекты):

do_something and do_something_other
person spickermann    schedule 14.08.2014
comment
Последний вариант использования является хорошим соображением. Тем не менее, я рекомендую использовать && вместо and. and имеет более низкий приоритет, чем присваивание. - person John Dvorak; 14.08.2014
comment
Я следую соглашению: используйте && для условий (foo? && bar?), но используйте and для потока управления (do_this and do_that). - person spickermann; 14.08.2014
comment
Способ пойти. Но я бы сказал, что самая важная часть здесь зависит от ситуации :-) - person John Dvorak; 14.08.2014

Изменить Как указал Смар, следующее может быть неверным для новейших версий Ruby. Проверяем прямо сейчас. Проблема продолжается здесь


spickermann дает хороший ответ, но его второй случай недостаточно ясен, поэтому я объясню его подробнее.

Обычно вы должны использовать if, так как он предназначен для этой цели.

bar if foo

Но часто вы хотите определить локальную переменную на пути оценки условия. В этом случае вы не можете использовать постфиксную нотацию if; следующее вызовет ошибку (при условии, что x не определено ранее):

bar(x) if x = h[:foo]

и вы должны использовать and, если хотите поместить его в одну строку.

x = h[:foo] and bar(x)
person sawa    schedule 14.08.2014
comment
Однако if не вызывает у меня ошибку; Я только что кинул h = {} ; bar(x) if x = h[:foo] на ирб. - person Smar; 14.08.2014
comment
@Smar Я только что подтвердил это. Происходит что-то странное. Даже неопределенный bar не вызывает ошибки. - person sawa; 14.08.2014
comment
Я предполагаю, что это новая функция Ruby 2.1 или около того. В любом случае, undefined bar() не выдаст ошибку, пока не будет оценено; попробуйте вместо этого: h = { :foo => "nyaaan" } ; bar(x) if x = h[:foo]. Если вы определили bar, оно будет выполнено, и x будет присвоено значение. - person Smar; 14.08.2014
comment
@Смар, я вижу. Я не знал этой особенности. Тогда это должно быть по той же причине. У вас есть ссылка на это изменение? - person sawa; 14.08.2014
comment
Понятия не имею, я только что проверил это сейчас, когда увидел ваш ответ. Я не знаю реальной информации об этом. - person Smar; 14.08.2014
comment
@Smar Я тестировал это на Ruby 1.9.3 и: 1-й не вызывает ошибку, 2-й вызывает ее. - person Darek Nędza; 14.08.2014
comment
@DarekNędza: но это вызывает ошибку «неопределенный метод», верно? Попробуйте определить bar() и ошибок быть не должно :) - person Smar; 14.08.2014
comment
@Smar Да, 2-й вызовите эту ошибку, но я считаю, что это не новая функция, поскольку она работает одинаково в версиях 1.9.3 и 2.1. - person Darek Nędza; 14.08.2014
comment
@DarekNędza Я считал, что второй должен вызывать ошибку независимо от версии, но мы со Смаром подтвердили, что это не так в Ruby 2. А вы подтвердили, что это происходит в Ruby 1.9. Так что похоже что-то изменилось. - person sawa; 14.08.2014
comment
Хм... Второй не выдает ошибку, если вы определяете bar(), но выдает, если вы этого не делаете, поскольку он пытается оценить метод, который не существует. По крайней мере, это происходит со мной на irb с ruby ​​2.1.1p76. Во всяком случае, синтаксических ошибок нет, просто ошибка об отсутствующем методе. - person Smar; 14.08.2014
comment
о, это не работает, поднимает ошибку на 2.1. Я понимаю. - person Darek Nędza; 14.08.2014
comment
я действительно предпочитаю использовать and, когда хочу вернуть некоторые данные. z = x and y. z будет равно 'x' или y что-то вроде z = x || y. - person ajahongir; 15.08.2014