Ruby requires an argument assignment logic: how does ordering work?

in Ruby, the required arguments take precedence when they are assigned in a method. Example:

arg_demo(a, b, c=1, *d, e, f)

here, a, b, c, e, f have a higher priority than the array of arguments * d.

when we call it:

arg_demo(1, 2, 3, 4, 5, 6, 7, 8)

the relevant parameters: a=1, b=2,c=3, *d=[4,5,6], e=7,f=8. In this case, * d gets its last assigned parameters.

If so, how does Ruby know to assign e to 7 and f to 8 (as if "reserving" 4,5,6 to lower priority * d)?

+4
source share
2 answers

Ruby . , , . , Ruby , , , , , ( 4 ). .

, , , , , 4, .

  • 1: , (.. / , ).

  • 2: , , , n n+m, n - m - .

  • 3: splatted .

  • 4: a , , , , a.

Ruby , , .

, Ruby .

def meth(w,x)
  [w,x]
end
meth 1,2
  #=> [1,2]

.

def meth(w,x,*y,z)
  [w,x,y,z]
end
meth 1,2,3,4,5,6
  #=> [1, 2, [3, 4, 5], 6]
meth 1,2,3
  #=> [1, 2, [], 3]

w z , x .

def meth(w,x=1,y,z)
   [w,x,y,z]
end
meth 1,2,3,4
  #=> [1, 2, 3, 4] 
meth 1,2,3
  #=> [1, 1, 2, 3] 

w z - , y .

, Ruby , ( ).

def meth(*x,y,*z)
  [x,y,z]
end
  #=> syntax error, unexpected keyword_end, expecting end-of-input

.

def meth(w,x=1,y,*z)
  [w,x,y,z]
end
  #=> syntax error, unexpected keyword_end, expecting end-of-input

Ruby , x , , y, *z.

, () , () , .

№ 1.

def meth(w,x,y=3,z)
  [w,x,y,z]       
end
meth 1,2,3,4
  #=> [1, 2, 3, 4] 
meth 1,2,3
  #=> [1, 2, 3, 3] 
meth 1,2
  #=> ArgumentError: wrong number of arguments (given 2, expected 3..4)
meth 1,2,3,4,5
  #=> ArgumentError: wrong number of arguments (given 5, expected 3..4)

№ 2.

, , , Ruby , ( / ).

:

def meth(*w,*x)
end
  #=> syntax error, unexpected *

def meth(*w,x=1)
end
  #=> syntax error, unexpected '=', expecting ')'

№ 3.

, splatted, .

def meth(w=1,x=2,*y)
  [w,x,y]
end
meth
  #=> [1, 2, []] 
meth 3
  #=> [3, 2, []] 
meth 3,4
  #=> [3, 4, []] 
meth 3,4,5
  #=> [3, 4, [5]] 
meth 3,4,5,6
  #=> [3, 4, [5, 6]] 

def meth(w=1,x=2)
  [w,x]
end
meth
  #=> [1, 2] 
meth 3
  #=> [3, 2] 
meth 3,4
  #=> [3, 4] 

, , , . , .

4.

, - def meth(w=1,*x) / def meth(w=1,x=2), , .

( ), ( ), . , .

+4
  • .
  • splat

, , ArgumentError.

, , . , , .

+2

Source: https://habr.com/ru/post/1655736/


All Articles