方法调用既不在Ruby documentation中也不在community wiki中提及。
or
or
似乎优先于没有括号的方法调用:
puts false or true
相当于
( puts false ) or true
并显示false
。
注意:我知道不应该使用or
。不过,这是一个很好的例子,表明某些运算符的优先级低于方法调用。
||
puts false || true
相当于
puts (false || true)
并显示true
。
用于方法调用don't seem的括号分组:
puts(false or true)
# SyntaxError: unexpected keyword_or
puts((false or true))
#=> true
带括号和不带括号的方法调用应该在此优先级table?
中我正在寻找表格中方法调用的确切位置。优选地,通过示例证明它低于前一个并且高于下一个。
目前的答案似乎也没有提到带括号的方法调用。
提前致谢!
答案 0 :(得分:7)
这旨在测试所有可能的情况。
注意,当说"运算符X
的优先级高于方法调用时," 的含义是参数。又名:
invocation foo X bar
而不是(调用对象)
X invocation
就第二种情况而言,方法调用总是具有更高的优先级。
它不合适:
SyntaxError
rescue
,但低于赋值not
()
)有时会导致SyntaxError
。这些案例包括:and
,or
,if
,unless
,until
,while
和rescue
and
,or
,后缀if
,unless
,until
,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
积分:
not
为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
积分:
and
或or
进行方法调用的SyntaxError
and
和or
无括号..
和...
致电<=>
。我们必须进一步测试&&
,||
,==
,!=
,修饰符rescue
, if
,unless
,until
,while
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)
积分:
and
和or
的优先级较低,没有括号&&
,||
,==
和!=
都有更高的优先级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
,unless
,until
,while
会导致SyntaxError
def error
puts 'Error'
raise
end
anything error rescue yes
anything(error rescue yes)
积分:
rescue
周围的括号会导致SyntaxError
rescue
的优先级较低三元:
anything yes ? no : 42
anything(yes ? no : 42)
积分:
分配(在更改yes
和no
时保留为最后一个):
anything yes = no
anything(no = five(42))
积分:
请注意,+=
等只是+
和=
的快捷方式,因此它们表现出相同的行为。
答案 1 :(得分:2)
在Ruby中,方法调用优先级似乎低于defined?
但高于or
。
例如:
puts defined? true
#=> true
puts false or true
#=> prints `false` and returns `true`
注意:
puts(not true)
和puts(false or true)
会引发语法错误。
答案 2 :(得分:2)
更新以实际回答问题。
官方方法没有优先权。然而,正如您所展示的那样,我们可以将它们排序到优先级列表中,它们介于我们可以考虑的范围之间&#34;运算符&#34;我们可以考虑什么&#34;控制流程&#34;关键字。
请参阅https://ruby-doc.org/core-2.2.0/doc/syntax/precedence_rdoc.html
以操作符开头,以
之类的控制流结构结束?, :
modifier-rescue
=, +=, -=, etc.
defined?
not
or, and
modifier-if, modifier-unless, modifier-while, modifier-until
唯一奇怪的是defined?
其中我不明白为什么它还没有被定义为Kernel
模块的全局函数。
缺少raise
,loop
,catch/throw
和其他人?
它们不是关键字,而是在module_function
模块上定义为Kernel
的方法调用。由于这个模块包含在Object
中,因此它们被制作成所有类的私有方法,因此看起来是可在任何地方使用的全局函数。
希望有助于回答这个问题。抱歉原始的copypasta。