如何在Crystal lang中将switch语句写入标识Array对象

koj*_*ix2 1 switch-statement crystal-lang

我想在Crystal lang而不是1d数组中只转换2d数组.所以我在下面写下switch语句.

a = [[1,2,3],[11,12,13]]
b = [1,2,3]

class Array
  def meow
    case self.first
    when Array
      puts self.transpose
    else
      puts "OK"
    end
  end
end

a.meow
b.meow
Run Code Online (Sandbox Code Playgroud)

此代码不起作用.我该如何解决?这是错误消息.

  Error in foo.cr:16: instantiating 'Array(Int32)#meow()'

  b.meow
    ^~~~

  in foo.cr:8: instantiating 'Array(Int32)#transpose()'

        puts self.transpose
                  ^~~~~~~~~

  in /usr/share/crystal/src/array.cr:1642: undefined method 'first' for Int32

      return Array(Array(typeof(first.first))).new if empty?
                                    ^~~~~
Run Code Online (Sandbox Code Playgroud)

Joh*_*ler 5

首先,通常不建议从标准库中添加补丁类型.

通过将数组作为参数分配给方法并将类型限制为,可以相对容易地解决问题Array(Array).不需要为任何子类型添加细节.

def meow(array : Array(Array))
  array.transpose
end

meow [[1, 2, 3], [11, 12, 13]]    # => [[1, 11], [2, 12], [3, 13]]
meow [[1, 2, 3], ["a", "b", "c"]] # => [[1, "a"], [2, "b"], [3, "c"]]
Run Code Online (Sandbox Code Playgroud)

您可能不需要接受一维数组的方法,因此meow [1, 2, 3]会导致编译器错误.

但是可以添加这样的重载:

def meow(array : Array)
  "OK"
end
Run Code Online (Sandbox Code Playgroud)