gpt4 book ai didi

ruby - 从单例类中检索 Ruby 对象?

转载 作者:数据小太阳 更新时间:2023-10-29 07:24:24 29 4
gpt4 key购买 nike

可以访问 singleton class来自 Ruby 对象:

some_object.singleton_class

是否可以进行相反的操作:在单例类中访问原始对象?

class << some_object
# how to reference some_object without actually typing some_object?
end

我想擦干这个method :

class Example
PARENTS = []
class << PARENTS
FATHER = :father
MOTHER = :mother
PARENTS.push(FATHER, MOTHER)
end
end

并尝试用更通用的东西替换类中的 PARENTS

最佳答案

我不知道有任何内置方法或关键字,但您可以编写一个方法,将(单例)方法添加到对象的单例类,返回对象本身:

class Object
def define_instance_accessor(method_name = :instance)
singleton_class.define_singleton_method(method_name, &method(:itself))
end
end

用法:

obj = Object.new              #=> #<Object:0x00007ff58e8742f0>
obj.define_instance_accessor
obj.singleton_class.instance #=> #<Object:0x00007ff58e8742f0>

在您的代码中:

class Example
PARENTS = []
PARENTS.define_instance_accessor
class << PARENTS
FATHER = :father
MOTHER = :mother
instance.push(FATHER, MOTHER)
end
end

在内部,YARV 将对象存储在名为 __attached__ 的实例变量中。实例变量没有通常的 @ 前缀,因此它在 Ruby 中不可见或不可访问。

这里有一个小的 C 扩展来公开它:

#include <ruby.h>

static VALUE
instance_accessor(VALUE klass)
{
return rb_ivar_get(klass, rb_intern("__attached__"));
}

void Init_instance_accessor()
{
rb_define_method(rb_cClass, "instance", instance_accessor, 0);
}

用法:

irb -r ./instance_accessor
> obj = Object.new
#=> #<Object:0x00007f94a11e1260>
> obj.singleton_class.instance
#=> #<Object:0x00007f94a11e1260>
>

关于ruby - 从单例类中检索 Ruby 对象?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54531270/

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