小编Ano*_*non的帖子

如何限制函数参数的类型

假设我有以下功能:

def encode(obj)
  case obj
  when Int32
    "i#{obj}e"
  when String
    "#{obj.size}:#{obj}"
  when Symbol
    encode(obj.to_s)
  when Array
    obj.reduce "a" {|acc, i| acc + encode(i)} + "e"
  else
    raise ArgumentError.new "Cannot encode argument of class '#{obj.class}'"
  end
end
Run Code Online (Sandbox Code Playgroud)

我想摆脱那个else分支,对参数的类型进行编译时检查.我可以这样写:

def encode(obj : Int32 | String | Symbol | Array)
Run Code Online (Sandbox Code Playgroud)

在这种情况下,没关系.但是,如果有更大的类型列表呢?有没有更优雅的方式来做到这一点?我希望编译器检查此函数是否只接受case表达式中匹配的那些类型.

type-inference switch-statement crystal-lang

4
推荐指数
1
解决办法
54
查看次数

有没有办法重新定义/禁用 self.new?

我试图找出一种方法来安全地释放类获得的资源。我尝试使用finalize,但它不可靠。有时我在 GC 有机会释放资源之前关闭我的程序。

所以我决定在这样的块中使用类实例:

class Foo

  def destroy # free resources
      #...
  end

  #...

  def self.create(*args)
      instance = self.new(*args)
      begin
        yield instance
      ensure
        instance.destroy
      end
end

Foo.create do |foo|
  # use foo
end
Run Code Online (Sandbox Code Playgroud)

这工作正常,但我仍然可以使用new我必须destroy明确创建的实例。我试图自己写,new但似乎默认情况下它只是超载了new。

有没有办法重新定义\禁用new?

resources instance crystal-lang

2
推荐指数
1
解决办法
79
查看次数