从单例类中检索 Ruby 对象?

2024-04-20

可以访问单例类 https://ruby-doc.org/core-2.5.1/Object.html来自 Ruby 对象:

some_object.singleton_class

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

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

我想把这个弄干method https://stackoverflow.com/a/54530568/6419007:

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

Usage:

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);
}

Usage:

irb -r ./instance_accessor
> obj = Object.new
#=> #<Object:0x00007f94a11e1260>
> obj.singleton_class.instance
#=> #<Object:0x00007f94a11e1260>
>
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

从单例类中检索 Ruby 对象? 的相关文章

随机推荐

  • 动态改变背景LinearLayout

    如何动态改变LinearLayout的背景 您是否尝试过其中之一 yourLayout setBackgroundColor int color yourLayout setBackgroundDrawable Drawable d you
  • 如何使用 Python 访问 Outlook 收件箱中的子文件夹

    我在 Outlook 中创建了一条规则 将来自特定发件人的所有传入邮件移至收件箱中的子文件夹 Like Inbox Subfolder 我写了一段代码 import win32com client outlook win32com clie
  • git - 有日志提交但缺少 .sln 文件,因此无法打开项目 - 如何恢复

    有什么方法可以使用 git 恢复我的项目文件吗 这是场景 我在一个分支机构工作了几天 该分支从未被推送到远程仓库 所以它完全是本地的 我最终丢失了 sln 解决方案文件 因此我无法再打开该项目 但在项目目录中我仍然有 git 目录 如果我发
  • ARView 黑屏

    我正在尝试以编程方式实例化 ARView 这是我的视图控制器代码 import Foundation import UIKit import RealityKit class ARViewController UIViewControlle
  • XPath 轴是否尊重 Xslt 排序?

    如果我像这样调用 xslt 模板
  • 如何在 Windows 上更改 npm 的缓存路径(或完全禁用缓存)?

    我已经在我的 Windows 7 x64 开发机器上安装了 Node js 手动方式 mkdir C Devel nodejs cd C Devel nodejs set NODE PATH CD setx M PATH PATH NODE
  • 用泛型 T 扩展类

    在 TypeScript 中 有没有办法用泛型类型扩展类 请参阅我的 假设场景 示例 其中我希望我的类具有名为 品种 或其他 的属性 interface dog breed string export class animal
  • 当我在 NetLogo 中取消世界环绕时,为什么会出现错误?

    我下载了一个工作模型 并正在对其进行调整以适应我的标准 我想禁用世界环绕 以便海龟在移动到初始屏幕时受到限制 但是当我这样做时 我收到一条错误消息 告诉我 OF预期输入是海龟代理集或补丁代理集或海龟或补丁 但没有得到任何人 欢迎来到 Sta
  • 如何使用多语言/多个index.html文件正确设置React Router?

    我正在构建一个 Web 应用程序 使用最新的 React 和 React Router 版本 就我而言 我的应用程序支持多种语言 并且由于索引 我们为每种语言都有单独的条目 html 文件 因此 对于像 myapp com 这样的 url
  • 使用 Shell 脚本根据条件编辑和更新 XML

    我想改变一个值 即value false 使用 Shell 脚本 我该如何去做呢 请向我提供任何建议 我尝试过 使用过的 我使用命令 gt sed s true false g ml xml Problem But all true内容改变
  • 为什么分配给多个目标(标识符/属性)会产生奇怪的结果?

    我有一些这样的代码 def foo bar initial bar Bar while True next bar Bar bar next bar next bar bar next bar return initial bar 其目的是
  • 具有 Room 和状态处理功能的 Kotlin 协程流

    我正在尝试新的协程流程 我的目标是创建一个简单的存储库 可以从 Web api 获取数据并将其保存到数据库 还可以从数据库返回流程 我使用 room 和 firebase 作为 Web api 现在一切看起来都非常简单 直到我尝试将来自 a
  • OCaml:用消息断言

    又是另一个问题 P 我不太确定是否应该将其发布在这里或 OCaml 邮件列表上 但我首先尝试这样做 我喜欢断言语句 然而 我发现如果没有附加消息 错误消息几乎毫无用处 第 XXX 行的断言冲突 很好 但实际上出了什么问题 我认为断言的一个很
  • 在 Javascript 中迭代数组

    我是一个 JavaScript 新手 我正在尝试练习一些示例 JavaScript 问题 当涉及到迭代数组的问题时 我有点困惑 有人能指出我正确的方向吗 我正在尝试接受价值观oldArray 分别添加 5 并存储在newArray var
  • Windows Phone 7 上的 Dispatcher.Invoke()?

    在回调方法中 我尝试获取文本框的文本属性 如下所示 string postData tbSendBox Text 但因为它不是在 UI 线程上执行 所以它给了我一个跨线程异常 我想要这样的东西 Dispatcher BeginInvoke
  • 从 powershell 脚本引用 .Net .dll

    您能帮我从 powershell 脚本引用 Net dll 吗 我正在使用 powershell ISE 编写 调试脚本 我有一些引用 Nuget 包的 net 代码 我想将该代码嵌入到 powershell 脚本中 如果我在 C WIND
  • 创建片段时的NPE

    我正在创建一个关于Fragment with sensorEventlitener 主要活动主办fragment如下代码所示 但在运行时我收到下面发布的内容logcat Errors 主要活动 public class MainActivi
  • 用于查找应用于特定分支的标签的命令

    用于查找应用于特定分支的标签的命令 假设我有一个名为 BR test 的分支名称 我想知道该分支上应用的所有标签是什么 如果这是 UCM 一个简单的lsbl就足够了 cleartool lsbl stream myStream mypvob
  • Django 的内存错误

    我有一个 Django 应用程序 它将大量数据加载到 sqlite3 数据库文件中 我们正在谈论数百万个条目 这些条目输入到一个函数中 在执行的某个时刻会抛出异常 File root codebase lib python2 6 site
  • 从单例类中检索 Ruby 对象?

    可以访问单例类 https ruby doc org core 2 5 1 Object html来自 Ruby 对象 some object singleton class 是否可以进行相反的操作 在单例类中访问原始对象 class lt