Метод String # против String # method () в ruby - PullRequest
1 голос
/ 03 марта 2012

В Ruby у нас есть классы, для которых мы запускаем методы. пример class.methodName. Теперь я пришел из мира PHP, где метод == функция и должен иметь круглые скобки. В рубине. Я заметил. оба работают и дают одинаковый результат:

  1. Без символов:

    "Gaurish".reverse  # => "hsiruaG"
    
  2. С символами:

    "Gaurish".reverse() # => "hsiruaG"
    

Оба одинаковы. Если да, то какой из них мы должны использовать. Если нет, то в чем разница?

Ответы [ 5 ]

4 голосов
/ 03 марта 2012

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

  1. Прежде всего, есть некоторые методы, которые почти всегда вызываются без скобок, даже с аргументами, например, puts - его аргумент редко заключен в скобки. То же самое относится и к методам, которые предоставляют доступ к переменным экземпляра, таким как person.name и аналогичным.

  2. Если у вас много методов в цепочке, то методы без аргументов обычно не будут иметь скобок, тогда как методы с аргументами будут иметь. Например. "aaaabc".squeeze.sub(/ab/,"c").upcase

  3. Если есть вложенные вызовы методов, которые не вызываются для объектов, аргументы темы должны быть заключены в круглые скобки, чтобы избежать путаницы, например. puts rand 5 - даже если это работает, может быть трудно понять, что здесь происходит, поэтому предпочтительным стилем является puts rand(5).

  4. Предыдущее правило не применяется к операторам (потому что они вызываются для объектов), поэтому будут видеть такие вызовы, как puts "abc" * 5 довольно часто. Ничего странного в этом нет - операторы имеют более высокие приоритеты, чем обычные вызовы методов, поэтому должно быть довольно легко выяснить, что происходит в такой ситуации (в приведенном примере строка сначала будет умножена, а затем передана в pust.

  5. Когда мы пишем something = 5 в контексте метода, может возникнуть путаница, если мы вызываем метод (что-то = (значение)) или присваиваем значение переменной. Использование скобок в этом случае было бы неудобно, поэтому обычным решением, когда мы хотим вызвать метод, является запись self перед именем метода, например, self.something = 5.

  6. Аналогичная ситуация возникает, когда мы вызываем метод получения или любой другой метод без параметров в контексте метода класса, например, name (без self). В таком случае есть два варианта: первый, описанный выше (self.name), и второй, где мы ставим скобки после имени метода (name()). Оба предпочтительнее, чем простое имя метода.

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

3 голосов
/ 03 марта 2012

Они одинаковые.Вызовы методов без пустых скобок более стандартны в Ruby.

2 голосов
/ 03 марта 2012

Да, стенд такой же. Также вам не нужно оборачивать параметры паренами, поэтому:

puts "lalala"
puts("lalala")

"alla".gsub 'la', 'a'
"alla".gsub('la', 'a')

То же самое. Я предпочитаю версию без паренов, но иногда, если вы цепляете вызов метода, они необходимы. Паренсы также необходимы, если вы хотите, чтобы возвращаемое значение метода передавалось как аргументы другого метода, т.е.

link_to I18n.translate('some text'), root_path
2 голосов
/ 03 марта 2012

() не являются обязательными.Все, что вы найдете более читабельным.

1 голос
/ 03 марта 2012

Они одинаковы, но синтаксис с парентезом предпочтительнее, если у вас есть параметры для вашего метода. Вот пример:

def foo x
  ...
end


foo a * 3

Что будет? Будет foo вызываться с, а затем результат будет умножен на 3 или наоборот. Это может быть немного запутанным. Также в irb, например, вы получаете предупреждение: «Parantesize аргументы для будущего использования».

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

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