Советы по пониманию синтаксиса Ruby, когда использовать? - PullRequest
4 голосов
/ 25 октября 2010

Является ли ключевое слово unless таким же, как if?

Когда вы используете ??

Я видел:

if someobject?

Я знаю, это проверяет ноль правильно?

Ответы [ 5 ]

13 голосов
/ 25 октября 2010

Является ли ключевое слово «исключая» тем же, что и «если»?

Нет, все наоборот.

unless foo совпадает с if !foo

if someobject?

Я знаю, что это проверяет ноль правильно?

Нет, он вызывает метод с именем someobject?. То есть ? является просто частью имени метода.

? можно использовать в именах методов, но только в качестве последнего символа. Обычно он используется для именования методов, которые возвращают логическое значение (т. Е. Либо true, либо false).

? также может использоваться как часть условного оператора condition ? then_part : else_part, но в вашем примере это не так.

2 голосов
/ 25 октября 2010

Это утверждение:

unless conditional expression

Эквивалентно:

if not (conditional expression)

В Ruby вы можете оканчивать имена методов знаком вопроса, который обычно используется, чтобы показать, что этологический метод.С Rails проверка на nil будет выглядеть следующим образом:

someobject.nil?

Это вызывает метод объекта nil? (), Который возвращает true для NilObject и false для всего остального.

2 голосов
/ 25 октября 2010

Я думаю, что соглашение для ? -суффикса состоит в том, чтобы использовать его при именовании метода, который возвращает логическое значение.Это не специальный символ, но он используется для облегчения понимания имени метода, или, по крайней мере, я думаю, что это было намерением.Он должен прояснить, что метод подобен задаче вопроса: он не должен ничего менять, только возвращать какой-то статус ...

Существует также суффикс !, который, я думаю, по соглашению означает, чтометод может иметь побочные эффекты или может изменять объект, к которому он вызывается (вместо того, чтобы возвращать измененную копию).В любом случае, ! должен заставить вас тщательно подумать о вызове такого метода и убедиться, что вы понимаете, что делает этот метод.

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

для unless см. Здесь: http://railstips.org/blog/archives/2008/12/01/unless-the-abused-ruby-conditional/

2 голосов
/ 25 октября 2010

unless на самом деле является противоположностью if. unless condition эквивалентно if !condition.

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

, например

unless file_exists?
  # create file
end

против

if !file_exists?
  # create file
end

Что касается ?, в Ruby существует соглашение о том, что логические методы должны заканчиваться на ?.

0 голосов
/ 25 октября 2010
if someobject?

Добавление '?' здесь только означает, что он возвращает логическое значение.

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