gpt4 book ai didi

crystal-lang - Crystal 郎 : in case of a Class as a field

转载 作者:行者123 更新时间:2023-12-04 04:47:36 25 4
gpt4 key购买 nike

我只是在写一个异常,它应该存储一个 Class 对象作为错误消息处理的字段。

class BadType < Exception
getter should_be : Class
getter actual : Class
end
def feed(pet : Animal, food : Food)
raise BadType.new should_be: Cat, actual: pet.class if food == "fish" && !pet.is_a?(Cat)
end

但是,Class 是抽象的,所以不能在这里用作字段类型。

那么,我的情况如何解决呢?我没有找到 Class 的任何派生类,这是否意味着永远不能将 Class 对象存储为字段?但这里我的问题是一个有意义的用法(任何依赖于输入的类型检查都可能需要这个 BadType)。

不知道是不是漏掉了什么,先来了

最佳答案

Class 不能(还)用作 ivar 类型。也许它永远不会,我不知道。

但是您实际上可以对具体数据类型使用泛型,从构造函数的参数推断出:

# possible workaround
class Foo(T, U)
def initialize(@bar : T, @baz : U)
end
end

Foo.new String, Int32

我不知道您的确切用例,但您可能并不真的需要这些值作为类。无论如何,您可能无法用它做很多事情,并且从您的示例中得出我猜它主要用于显示调试信息。

因此很可能只存储类的名称(作为字符串)是解决此问题的更好方法。

# better solution
class Foo
@bar : String
@baz : String
def initialize(bar : Class, baz : Class)
@bar = bar.name
@baz = baz.name
end
end

Foo.new String, Int3

泛型参数意味着为 Foo 使用的每个类组合创建一个新的具体类型。这会对编译器性能产生影响。

我绝对会为此使用字符串。即使您稍后需要这些类进行某些特殊处理,使用宏生成的查找表将字符串映射到常量可能会更好。

关于crystal-lang - Crystal 郎 : in case of a Class as a field,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51780796/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com