Какъв е приоритетът на извикването на метод на ruby

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

Например, когато въведа нещо като по-долу в irb

Math.sqrt 2 + 2

Получих 2.0 като резултат. Без категоричните правила за приоритет, просто не мога да реша къде да използвам скобите и къде да ги пропусна. Така че, моля, някой да ми помогне да се отърва от тази несигурност. Благодаря предварително!


person Need4Steed    schedule 11.10.2011    source източник


Отговори (4)


Всеки оператор има предимство пред извикването на метода. Силно се препоръчва да използвате () за извиквания на метод, за да избегнете ситуации като тази, за която питате.

person Community    schedule 11.10.2011
comment
Any operator has precedence over the method call. Това е грешно. puts false or true показва false, puts false || true показва true. - person Eric Duminil; 24.12.2016

Извикването на Ruby метод има по-нисък приоритет от който и да е от операторите, но това не е цялата история - има някои крайни случаи, които не са очевидни. Вашият въпрос ме предизвика любопитство за един от тях, така че попитах в списъка с имейли на ruby-talk. Трябва да намерите получената нишка за полезна.

Освен това прочетете тази публикация в блога за добър аргумент, че трябва да използвате скобите щедро, особено докато сте изучаване на рубин.

person Martin DeMello    schedule 12.10.2011
comment
Малко вероятно е, но случайно да имате алтернативна връзка за тази публикация в блога? Връзката вече е повредена и не мога да я намеря нито в archive.org, нито в Google. - person Adam Rosenfield; 24.05.2017
comment
ето ви: graysoftinc.com/early-steps/do-i- трябват-тези-скоби - person Martin DeMello; 30.05.2017

В 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

person Tilo    schedule 11.10.2011
comment
@Tile, мога ли да получа директни отговори, моля? - person Need4Steed; 11.10.2011
comment
@Need4Steed Мисля, че е прав - трябва просто да го потърсите в Google - изобщо не изглежда, че сте проучили въпроса сами - person ; 11.10.2011
comment
Не виждам никакво тролене и проверих редакциите. Този отговор беше полезен. - person d11wtq; 11.10.2011
comment
гугъл какво точно? Прекарах десет до петнадесет минути, опитвайки се да намеря полезна страница, към която да насоча OP, и излязох празен. и аз използвах ruby ​​през последните 12 години, така че имах доста добра представа какви думи за търсене да използвам. що се отнася до отговора на tile, той не само беше безполезен (както той щеше да види, ако наистина си беше направил труда да прочете правилно оригиналния въпрос и/или действително изпълни заявката), но беше свързан с lmgtfy, което, ако не е пълноценно тролене най-малкото безпричинно груб. - person Martin DeMello; 12.10.2011
comment
@Martin: търсенето в скобите на Ruby Operator Precedence и Ruby Method Call доведе до много полезни резултати за мен -- отговорът на Tilo сочеше в правилната посока. LMGTFY просто посочва, че отговорът е лесен за намиране, ако човек положи усилия. - person ; 12.10.2011
comment
въпросите на need4steed обаче бяха много специфични - той искаше да знае точните правила, които управляват анализирането и приоритета на аргументите за извикване на рубин метод, и това наистина е доста трудно да се намери изписано - person Martin DeMello; 12.10.2011
comment
защо хората трябва да са такива глупаци за нещата? Само защото отговорът е там, не означава, че всеки може да го прочете и разбере на едно и също ниво. - person killerbarney; 28.02.2013
comment
Надявам се, че това изяснява отговора - person Tilo; 07.03.2013
comment
Това всъщност е грешно, Math.sqrt 2 + 2 се интерпретира като Math.sqrt(2 + 2). Също така силно се съмнявам, че оставянето на скоби е резултат от „мързел“. Вие също не отговаряте наистина на въпроса и вместо това го заобикаляте, като просто казвате винаги да използвате скоби. - person Andrew Marshall; 15.07.2013
comment
-1, защото Ruby в средата е неточен (РЕДАКТИРАНЕ: поне за 1.9.3). Ако, както се казва в коментара, && и || имат еднакъв приоритет, бих очаквал този първи израз да оценява отляво надясно, т.е. (true || true) && false, което е false. Също така второто твърдение гласи, че true || (true && false) е false, когато не е, това е true. - person nickgrim; 31.12.2013

Можем да използваме вашата връзка Programming Ruby като отправна точка и да открием сами къде принадлежат извикванията на метод без скоби в таблицата с приоритети. Ще покажа само последните тестове, които определят местоположението.

По-ниска е от defined?:

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

Аха, по-високо е от not:

not Math.sqrt 2
=> false

Сега знаете точно кога трябва да използвате скоби.

Странична бележка

(благодарение на връзката на Martin Demello към 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
person Kelvin    schedule 24.08.2017