gpt4 book ai didi

Ruby:如何只允许将某种对象添加到集合中

转载 作者:太空宇宙 更新时间:2023-11-03 17:23:50 25 4
gpt4 key购买 nike

我想创建一个 Set,它只允许添加某种 ( kind_of?) 对象,并在尝试添加外来对象时引发异常。

我还没有找到任何资源,在我开始摆弄 ruby​​ 核心类之前,如果能提供任何如何以“不引人注目”的方式实现这一点的建议,我将不胜感激。

补充:我的目标实际上是创建一个类似于 C++ 中的“模板化”容器类(例如 Set),这样我就可以在定义实例时设置一次类型,并在类级别比较两个集合(如果它们是相同(即接受相同类型)但保持与“默认”集合的互操作性,例如 set_instance_a.class == set_instance_b.class如果他们接受相同类型的对象,应该产生 true。

我的一个想法是让 ::[] 过载运算符,这样我就可以写出类似 my_set = MySet[Foo] 的东西应该返回 MySet只接受 Foo 类型对象的实例

谢谢!

最佳答案

Class也是一个对象,因此您可以根据需要在运行时创建新类。 Class 构造函数允许您指定基类,甚至可以在新类的上下文中评估代码:

new(super_class=Object) → a_class
new(super_class=Object) { |mod| ... } → a_class

Creates a new anonymous (unnamed) class with the given superclass (or Object if no parameter is given). You can give a class a name by assigning the class object to a constant.

If a block is given, it is passed the class object, and the block is evaluated in the context of this class using class_eval.

class_eval允许您定义方法和别名。所有这些意味着你可以这样说:

module Kernel
def MySet(c)
Class.new(Set) do
@@allowed = c
def add(o)
raise ArgumentError.new("#{o.class} is stinky!") if(!o.is_a?(@@allowed))
super(o)
end
alias_method :<<, :add
end
end
end

然后:

s = MySet(String).new
s.add(6) # Exception!
s << 'pancakes' # Allowed

我将 MySet 方法修补到 Kernel 中,以便与 ArrayComplex、... methods-that-pretend-to-be-functions,你可以把它放在任何你喜欢的地方。

关于Ruby:如何只允许将某种对象添加到集合中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20558294/

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