Linca

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 为随机数

Linca · Zero Calorie Drink Shop