首页 / 知识
在Ruby中按名称以编程方式访问变量
2023-04-15 02:18:00

Access variables programmatically by name in Ruby我不确定在Ruby中是否可行,但是希望有一种简单的方法。 我想声明一个变量,然后找出该变量的名称。 也就是说,对于这个简单的代码段:
我如何找回数组的名称(在这里为" foo")? 如果确实可行,这是否适用于任何变量(例如,标量,哈希等)? 编辑:这是我基本上想做的。 我正在编写一个SOAP服务器,该服务器使用三个重要变量包装了一个类,验证代码本质上是这样的:
我的问题是:我可以用foo,goo或bar替换'param_name'的实例吗? 这些对象都是数组,所以到目前为止,我收到的答案似乎无效(除了重新设计整个过程之外,ala dbr的答案) 如果您解决问题了怎么办?与其尝试从变量中获取名称,不如从名称中获取变量:
如果有可能根本没有定义变量(而不是不是数组),则需要在" param = ..."行的末尾添加" rescue nil"以保持评估从引发异常... 您需要重新设计解决方案。即使可以(不能),问题也没有合理的答案。 想象一个get_name方法。
每个人都可能同意这应该返回" a"
它应该返回" b"或" a",还是包含两者的数组?
它应该返回" arg"," b"还是" a"?
它应该返回'arg','b'或'a',还是所有它们的数组?即使它确实返回了数组,其顺序也将如何,我怎么知道如何解释结果? 以上所有问题的答案是"这取决于我当时想要的特定事物。"我不确定您如何解决Ruby的问题。 看来您正在尝试解决一个容易解决的问题。 为什么不将数据仅存储在哈希中?如果你这样做..
..然后完全变得微不足道,以获取'foo'名称。 就是说,您尚未对该问题提供任何背景信息,因此可能有您不能执行此操作的原因。
[编辑]澄清之后,我看到了问题,但我不认为这是问题所在。使用[foo,bar,bla],就相当于说 问题不在于遍历[foo,bar]等,这是SOAP服务器如何重现数据和/或尝试使用它的根本问题。 我想说的解决方案是使SOAP服务器返回哈希值,或者因为您知道总会有三个元素,所以您不能做类似的事情。
好的,它也可以在实例方法中工作,并且根据您的特定要求(您在注释中提出的要求),您可以执行以下操作:
只需将
好问题。我完全理解你的动机。让我首先指出,存在某些特殊对象,在某些情况下,它们对已分配给变量的变量有所了解。这些特殊对象是例如。
要注意的是,这仅在执行赋值的变量为常数时有效。 (我们都知道Ruby常数不过是情感敏感的变量。)因此:
知道对象被分配了哪些变量的对象的这种行为通常称为常量魔术(因为它仅限于常量)。但是,这种高度期望的恒定魔术仅适用于某些对象:
幸运的是,我写了一个gem
实际上,这仅适用于常量(即,以大写字母开头的变量)并不是很大的限制。实际上,它使您可以随意命名或不随意命名对象:
不幸的是,这不适用于数组文字,因为它们是在内部构造而未使用
通过在当前Ruby对象空间的所有命名空间中搜索所有常量,我实现了常量的魔术模仿行为。这浪费了几分之一秒的时间,但是由于搜索仅执行一次,因此一旦对象找出其名称,就不会造成性能损失。将来,Ruby核心团队已承诺
有 在joshmsmoore的基础上,可能会执行以下操作:
我不知道以任何方式获取局部变量名称。但是,您可以使用 简单的电话:
要么
获取所有实例变量名称的数组。 对于您的问题,最接近实际答案的方法是使用Enumerable方法each_with_index而不是每个方法,因此:
我从您传递给each / each_with_index的块中删除了return语句,因为它没有执行任何操作。每个和each_with_index都返回它们在其上操作的数组。 块中还有一些关于范围的注意事项:如果您在块外定义了变量,则该变量将在其中可用。换句话说,您可以直接在块内部引用foo,bar和baz。相反,事实并非如此:您在块内首次创建的变量将无法在块外使用。 最后,do / end语法是多行块的首选,但这只是样式问题,尽管它在任何最近年份的红宝石代码中都是通用的。 Foo只是保存指向数据的指针的位置。数据不知道它指向什么。在Smalltalk系统中,您可以要求VM提供指向对象的所有指针,但这只会使您获得包含foo变量的对象,而不是foo本身。在Ruby中没有真正的方法来引用可用商品。就像一个答案提到的那样,您可以在数据中放置一个标记,以引用它的来源,但通常这并不是解决大多数问题的好方法。您可以首先使用散列来接收值,也可以使用散列来传递给循环,这样您就可以像DBR的答案一样知道用于验证目的的参数名称。 不能,您需要返回到绘图板上并重新设计您的解决方案。 |
最新内容
相关内容
编程解析linux命令?
编程解析linux命令?,系统,标准,基础,设备,发行,电脑,工具,密码,名字,适当,如何学习linux命令之ls的使用ls Linux常用命令中,ls用于列出当前路径linux使用命令的方法?
linux使用命令的方法?,系统,信息,工具,标准,数据,命令,左下角,目录,文件夹,图标,linux的cd命令的使用方法1、cd ~:回到用户家目录。注:这得看你linux命令主机名变量?
linux命令主机名变量?,系统,主机名,查询系统,命令,终端,编辑,提示符,根目录,文件,用户,linux如何修改主机名首先,以 root 用户身份登录 Red Hatlinux命令行图形编程?
linux命令行图形编程?,系统,不了,情况,密码,工具,地方,百度,管理,图形界面,命令,linux下启动图形化界面的命令是不是startx?当启动文件找不到linux编程执行命令?
linux编程执行命令?,电脑,系统,环境,命令,基础,发行,工具,代码,地址,名称,linux为脚本程序指定执行权的命令及参数是1、chmod u+x file,如果只linux终端命令行编程?
linux终端命令行编程?,系统,工作,命令,终端,概念,时间,第一,代码,发行,地方,Linux下5个有趣的命令行技巧介绍我们可以使用history命令来查看曾linux编程调用命令?
linux编程调用命令?,系统,标准,管理,工作,基础知识,情况,环境,设备,基础,首页,linux下怎样用c语言调用shell命令可以通过system函数,调用shelllinux编程所需的命令?
linux编程所需的命令?,工作,地址,档案,系统,命令,管理,标准,信息,目录,文件,Linux必须学会的60个命令:文件处理1应用实例如果我们看到一个没有linux命令行编程乱码?
linux命令行编程乱码?,环境,统一,乱码,中文,状态,软件,数据,系统,字符集,文件,为什么我进入Linux的终端窗口时,man一条命令出来的都是乱码呢?linux变量是一个命令?
linux变量是一个命令?,系统,信息,变量,名称,官网,地址,环境,代码,地方,命令,$在linux里什么意思所谓$:也就是咱们平常说的“命令提示符”也就是linux中变量取余命令?
linux中变量取余命令?,地址,工作,系统,数据,信息,命令,分析,目录,控制台,文件,linux系统常用操作命令linux常用命令有pwd命令、cd命令、ls命令linux创建数组命令?
linux创建数组命令?,地址,工作,系统,信息,命令,代码,目录,情况,标准,文件,Linux命令linux系统常用操作命令如下:ls:全拼list,功能是列出目录的内