Рубин имеет ограниченную форму деструктурирующего связывания:
ary = [1, 2, 3, 4]
a, b, c = ary
p a # => 1
p b # => 2
p c # => 3
a, b, *c = ary
p c # => [3, 4]
a, b, c, d, e = ary
p d # => 4
p e # => nil
Он также имеет ограниченную форму структурирования привязки:
a = 1, 2, 3
p a # => [1, 2, 3]
Вы можете объединить эти две формы следующим образом:
a, b = b, a # Nice way to swap two variables
a, b = 1, 2, 3
p b # => 2
def foo; return 1, 2 end
a, b = foo
p a # => 1
p b # => 2
Есть несколько других вещей, которые вы можете сделать с деструктурированием / структурированием связывания. Я не показывал оператор сплат (*
) с правой стороны. Я не показывал вложенность (используя парантезы). Я не показал, что вы можете использовать деструктурирующую привязку в списке параметров блока или метода.
Вот только закуска:
def foo(((a, b, c, d), e, *f), g, *h)
local_variables.sort.each do |lvar| puts "#{lvar} => #{eval(lvar).inspect}" end
end
foo([[1, 2, 3], 4, 5, 6], 7, 8, 9)
# a => 1
# b => 2
# c => 3
# d => nil
# e => 4
# f => [5, 6]
# g => 7
# h => [8, 9]