Каков приоритет вызова метода ruby? - PullRequest
3 голосов
/ 11 октября 2011

http://phrogz.net/programmingruby/language.html#table_18.4 Таблица, представленная по ссылке выше, дает только приоритет операторам ruby.Каков приоритет метода (или я должен сказать: сообщение / функция)?

Например, когда я ввожу что-то, как показано ниже в irb

Math.sqrt 2 + 2

, я получил 2,0 в результате.Без определенных правил приоритета я просто не могу решить, где использовать парены и где их опускать.Итак, кто-то, пожалуйста, помогите мне избавиться от этой неопределенности.Заранее спасибо!

Ответы [ 4 ]

3 голосов
/ 11 октября 2011

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

2 голосов
/ 12 октября 2011

Вызов метода Ruby имеет более низкий приоритет, чем любой из операторов, но это еще не все - есть некоторые крайние случаи, которые неочевидны. Ваш вопрос вызвал у меня интерес к одному из них, поэтому я спросил в списке рассылки ruby-talk . Вы должны найти результирующий поток полезным.

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

1 голос
/ 11 октября 2011

В Ruby любой оператор имеет приоритет над вызовами методов, например операторы оцениваются первыми.

Однако пример Math.sqrt 2 + 2 является хорошей иллюстрацией того, насколько трудно читать и не интуитивно понятно, что можно оставить скобки. Можно ожидать, что Math.sqrt(2) + 2 будет оцениваться здесь.

Когда вы сталкиваетесь с такой строкой, вы можете подумать: что задумал кодер? Это ошибка?

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

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

Вот хороший пример, с которым я недавно столкнулся:

  def foo(arg)
    raise "error"
  end
  x = foo 4 rescue 7
  x 
    => nil    # oops!

  x = foo(4) rescue 7
  x
    => 7

Надеюсь, это прекрасно иллюстрирует, почему важно использовать круглые скобки

Также:

Проверьте здесь, в разделе «Вызов метода»: http://ruby -doc.org / docs / ProgrammingRuby / html / tut_methods.html Цитата:

[...] Если нет неоднозначность вы можете опустить скобки вокруг списка аргументов, когда вызов метода. [...] Однако, за исключением самых простых случаев, мы не порекомендуйте --- есть некоторые тонкие проблемы, которые могут сбить вас с толку вверх. [В частности, вы должны использовать скобки при вызове метода, который сам параметр для вызова другого метода (если это не последний параметр).] Наше правило простое: если есть сомнения, используйте Скобки.

Смотри также: http://phrogz.net/programmingruby/language.html

0 голосов
/ 24 августа 2017

Мы можем использовать вашу ссылку на программирование в Ruby в качестве отправной точки и выяснить для себя, где вызовы методов без скобок относятся к таблице приоритетов. Я собираюсь показать только последние тесты, которые точно определяют местоположение.

Это ниже, чем defined?:

defined? Math.sqrt 2
# => SyntaxError: unexpected tINTEGER, expecting end-of-input

Ага, это выше, чем not:

not Math.sqrt 2
=> false

Теперь вы точно знаете, когда следует использовать скобки.

Sidenote

(благодаря ссылке Мартина Демелло на ruby-talk за напоминание)

Имейте в виду, что операторы в таблице применяются, только когда они не используются в синтаксисе вызова метода. Пример - следующее не подчиняется правилам для * и +, потому что они используются не как операторы, а как методы:

# This happens because unparenthesized method calls are right-associative.
2.* 5.+ 2  # => 14

Если это выглядит запутанным, то же самое происходит и здесь:

# The `modulo` is evaluated first because it's on the right
Math.sqrt 9.modulo 5
...