ruby – 带括号和没有括号的方法调用的优先级是什么?

前端之家收集整理的这篇文章主要介绍了ruby – 带括号和没有括号的方法调用的优先级是什么?前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
以前的答案

answer到类似的question错误的.

Ruby documentationcommunity wiki都没有提到方法调用.

没有括号的方法调用

高于或

或者似乎比没有括号的方法调用具有更低的优先级:

puts false or true

相当于

( puts false ) or true

显示错误.

注意:我知道或不应该使用.不过,这是一个很好的例子,表明某些运算符的优先级低于方法调用.

低于||

puts false || true

相当于

puts (false || true)

显示真实.

用括号调用方法

用于方法调用don’t seem的括号分组:

puts(false or true)
# SyntaxError: unexpected keyword_or
puts((false or true))
#=> true

在有和没有括号的方法调用应该在table的优先级中的哪个位置?

赏金澄清

我正在寻找表中方法调用的确切位置.优选地,通过示例证明它低于前一个并且高于下一个.

目前的答案似乎也没有提到带括号的方法调用.

提前致谢!

解决方法

序幕

这旨在测试所有可能的情况.

注意,当说“运算符X具有比方法调用更高的优先级”时,意味着在参数中.又名:

invocation foo X bar

而不是(呼吁对象)

X invocation

就第二种情况而言,方法调用始终具有更高的优先级.

简短的回答

它不适合:

>在某些情况下会导致SyntaxError
>它的优先级高于救援,但低于任务

摘要

>不管括号如何,在方法调用之后都不能使用
>对方法调用使用方括号(())有时会导致语法错误.这些案件是:和,或者,如果,除非,直到,同时和救援
>如果括号不会导致错误,则它们不会以任何方式更改优先级
>所有运算符,除了和,或后缀if,直到while,rescue的优先级高于方法调用

让我们尝试一下:

class Noone < BasicObject
  undef_method :!

  def initialize(order)
    @order = order
  end

  def method_missing(name,*args)
    @order << name
    self
  end
end

第一个一元:

# + and - will become binary
unary_operators = %i(! ~ not defined?)

puts 'No brackets'
unary_operators.each do |operator|
  puts operator

  order = []
  foo = Noone.new order
  bar = Noone.new order
  begin
    eval("foo.Meta #{operator} bar")
  rescue SyntaxError => e
    puts e
  end
  p order
  puts '-----------'
end

puts 'Brackets'
unary_operators.each do |operator|
  puts operator

  order = []
  foo = Noone.new order
  bar = Noone.new order
  begin
    eval("foo.Meta(#{operator} bar)")
  rescue SyntaxError => e
    puts e
  end
  p order
  puts '-----------'
end

积分:

>不是在方法调用之后是SyntaxError
>无论括号如何,所有一元运算符的优先级都高于方法调用

现在二进制:

binary_operators = %i(
  **
  * / %
  + -
  << >>
  &
  | ^
  > >= < <=
  <=> == === =~
  .. ...
  or and
)

puts 'No brackets'
binary_operators.each do |operator|
  order = []
  foo = Noone.new order
  bar = Noone.new order
  baz = Noone.new order
  begin
    eval("foo.Meta bar #{operator} baz")
  rescue SyntaxError => e
    puts e
  end
  p order
end

puts 'Brackets'
binary_operators.each do |operator|
  order = []
  foo = Noone.new order
  bar = Noone.new order
  baz = Noone.new order
  begin
    eval("foo.Meta( bar #{operator} baz)")
  rescue SyntaxError => e
    puts e
  end
  p order
end

积分:

>方法调用周围的括号使用和或或是一个SyntaxError
>我们必须测试和/或进一步没有括号
> ..和…呼叫< =>.我们必须进一步测试
>我们无法通过这种方式测试其他一些二元运算符,即&&,||,==,!=,modifier rescue,if,而
>除了上面提到的,操作符具有更高的优先权,无论括号如何

def yes
  puts 'yes'
  true
end

def no
  puts 'no'
  false
end

def anything(arg)
  puts 'Anything'
  arg
end

anything yes and no
anything no or yes
anything yes && no
anything no || yes
anything(yes && no)
anything(no || yes)

anything yes == no
anything(yes == no)
anything yes != no
anything(yes != no)

积分:

>和和或没有括号的优先级较低
无论括号如何,&&,==和!=都具有更高的优先级

def five(*args)
  p args
  5
end

five 2..7
five(2..7)
five 2...7
five(2...7)

积分:

> ..和…无论括号如何都具有更高的优先级

anything yes if no
anything(yes if no)
anything no unless yes
anything(no unless yes)

anything no until yes
anything(no until yes)
anything yes while no
anything(yes while no)

积分:

>括号if,until,while导致SyntaxError
>以上所有优先级都低于没有括号的方法调用

def error
  puts 'Error'
  raise
end

anything error rescue yes
anything(error rescue yes)

积分:

> rescue周围的括号会导致SyntaxError
>如果没有括号,则救援的优先级较低

三元:

anything yes ? no : 42
anything(yes ? no : 42)

积分:

>无论括号如何,三元都有更高的优先级

分配(留为最后,因为它改变是和否):

anything yes = no
anything(no = five(42))

积分:

>赋值具有比调用更高的优先级

请注意,=等只是和=的快捷方式,因此它们表现出相同的行为.

猜你在找的Ruby相关文章