Project

General

Profile

Actions

Bug #19782

closed

Ruby operators precedence inconsistency

Added by hurricup (Alexandr Evstigneev) 12 months ago. Updated 12 months ago.

Status:
Rejected
Assignee:
-
Target version:
-
[ruby-core:114270]

Description

Unfortunately I could not find a good documentation regarding ruby operators precedence and associativity, but according to https://ruby-doc.org/3.2.2/syntax/precedence_rdoc.html
&& has higher precedence than assignment.
Meaning that
a && b = c would be treated as (a && b) = c which makes a little sense, but still.
But ruby 3.2.2 shows that it works as a && (b = c) (if I read it right):

def moo(a,b,c)
  if a && b = c

  end
end

puts RubyVM::InstructionSequence.of(method :moo).disasm

Gives me

== disasm: #<ISeq:moo@/home/hurricup/Projects/untitled/test.rb:1 (1,0)-(5,3)> (catch: false)
local table (size: 3, argc: 3 [opts: 0, rest: -1, post: 0, block: -1, kw: -1@-1, kwrest: -1])
[ 3] a@0<Arg>   [ 2] b@1<Arg>   [ 1] c@2<Arg>
0000 getlocal_WC_0                          a@0                       (   2)[LiCa]
0002 branchunless                           13
0004 getlocal_WC_0                          c@2
0006 dup
0007 setlocal_WC_0                          b@1
0009 branchunless                           13
0011 putnil
0012 leave                                                            (   5)[Re]
0013 putnil                                                           (   2)
0014 leave                                                            (   5)[Re]

For example, perl has well documentation and same rules regarding these two ops: https://perldoc.perl.org/perlop#Operator-Precedence-and-Associativity
And if you try:

use v5.38;

my($var1, $var2, $var3) = (1,2,3);

$var1 && $var2 = $var3;

say $var1, $var2, $var3;

You will get expected:

Can't modify logical and (&&) in scalar assignment at /home/hurricup/Projects/untitled/test.pl line 5, near "$var3;"
Execution of /home/hurricup/Projects/untitled/test.pl aborted due to compilation errors.

Could you please clarify this?
Also would be really nice to have documentation on how precedence work, including calls without parens, like some.thing expr which precedence is consumed by expr here?

Actions

Also available in: Atom PDF

Like0
Like0Like0Like0