
Linca
@linca
关于 Ruby 有多少解构赋值 / pattern matching 这件事。
-
基础
a, b = [1, 2] # a = 1 ; b = 2 -
复杂的基础
a, (b, c), d = [1, [2, 3], 4] # a = 1 ; b = 2 ; c = 3 ; d = 4 -
解构数组
a, *b = [1, 2, 3, 4] # a = 1 ; b = [2, 3, 4] -
in关键字[1, 2, 3] in a, b, c # a = 1 ; b = 2 ; c = 3 -
=>[1, 2, 3] => a, b, c # a = 1 ; b = 2 ; c = 3似乎只有右边放变量才能解构哈希
{a: 1, b: 2} => a:, b: # a = 1 ; b = 2 -
更奇怪的解构
通过类型来解构
[1,2,3,"str",4,5,6] => *a, String => b, *c # a = [1, 2, 3] ; b = "str" ; c = [4, 5, 6]通过值来解构
[1,2,3,"str",4,5,6] => *a, 4 => b, *c # a = [1, 2, 3, "str"] ; b = 4 ; c = [5, 6]但是类型不能是值……?
[1,2,3,String,4,5,6] => *a, String => b, *c # [1, 2, 3, String, 4, 5, 6] does not match to find pattern (NoMatchingPatternError) -
还能类似 Elixir 那样 pin 一个值
b = 3 [1, 2, 3, 4, 5] => *a, ^b, *c # a = [1, 2] ; b = 3 ; c = [4, 5] -
也能自定义解构规则
class Test def deconstruct_keys(keys) p keys keys.each_with_object({}) do |key, hash| hash[key] = rand end end def deconstruct [1,1,4,5,1,4] end end t = Test.new t => a, b, c, d, e, f # a = 1 ; b = 1 ; c = 4 ; d = 5 ; e = 1 ; f = 4 t => a:, b:, c: # a, b, c 为随机数