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

时间:2018-02-10 23:59:41

标签: 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

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

  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?
                                    ^~~~~

2 个答案:

答案 0 :(得分: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"]]

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

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

def meow(array : Array)
  "OK"
end

答案 1 :(得分:2)

其中一个解决方案可能就是:

dob = raw_input("Please enter the string ")
if "/" in dob:
    print dob.split("/")
else:
    print dob.split("\\")