当前位置:  开发笔记 > 编程语言 > 正文

在Ruby中按名称以编程方式访问变量

如何解决《在Ruby中按名称以编程方式访问变量》经验,为你挑选了4个好方法。

我不完全确定Ruby是否可行,但希望有一种简单的方法可以做到这一点.我想声明一个变量,然后找出变量的名称.也就是说,对于这个简单的片段:

foo = ["goo", "baz"]

如何获取数组的名称(此处为"foo")?如果它确实可能,这是否适用于任何变量(例如,标量,散列等)?

编辑:这是我基本上要做的事情.我正在编写一个包含三个重要变量的类的SOAP服务器,验证代码基本上是这样的:

  [foo, goo, bar].each { |param|
      if param.class != Array
        puts "param_name wasn't an Array. It was a/an #{param.class}"
        return "Error: param_name wasn't an Array"
      end
      }

我的问题是:我可以用foo,goo或bar替换'param_name'的实例吗?这些对象都是数组,所以到目前为止我收到的答案似乎不起作用(除了重新设计整个事情ala dbr的答案)



1> glenn mcdona..:

如果你扭转了问题怎么办?而不是尝试从变量中获取名称,从名称中获取变量:

["foo", "goo", "bar"].each { |param_name|
  param = eval(param_name)
  if param.class != Array
    puts "#{param_name} wasn't an Array. It was a/an #{param.class}"
    return "Error: #{param_name} wasn't an Array"
  end
  }

如果有可能根本没有定义变量(而不是数组),你可能想在"param = ..."行的末尾添加"rescue nil"来保持eval从抛出异常......



2> Orion Edward..:

您需要重新构建解决方案.即使你做到(你做不到),问题根本就没有合理的答案.

想象一下get_name方法.

a = 1
get_name(a)

每个人都可能同意这应该返回'a'

b = a
get_name(b)

它应该返回'b','a'还是包含两者的数组?

[b,a].each do |arg|
  get_name(arg)
end

它应该返回'arg','b'还是'a'?

def do_stuff( arg )
  get_name(arg)
do
do_stuff(b)

它应该返回'arg','b'或'a',还是所有这些的数组?即使它确实返回了一个数组,顺序是什么,我怎么知道如何解释结果呢?

上述所有问题的答案是"这取决于我当时想要的特定事物." 我不确定如何解决Ruby的问题.


绝对是所有有效点(因此是upvote).但是看看格伦的答案,肯定是值得的.

3> dbr..:

看来你正试图解决一个容易解决的问题.

为什么不将数据存储在哈希中?如果你这样做..

data_container = {'foo' => ['goo', 'baz']}

获得'foo'这个名字真是微不足道.

也就是说,你没有给出任何问题的背景,所以可能有理由你不能这样做..

[编辑]澄清后,我看到了问题,但我认为这不是问题.. [foo,bar,bla],就像说的那样['content 1', 'content 2', 'etc'].实际变量名称(或者更确切地说,应该是)完全不相关.如果变量的名称很重要,那么这就是为什么存在哈希的原因.

问题不在于迭代[foo,bar]等,这是SOAP服务器如何撤回数据的根本问题,和/或您尝试使用它的方式.

我想说,解决方案是让SOAP服务器返回哈希值,或者,因为你知道总会有三个元素,你能不能做类似的事情.

{"foo" => foo, "goo" => goo, "bar"=>bar}.each do |param_name, param|
      if param.class != Array
        puts "#{param_name} wasn't an Array. It was a/an #{param.class}"
        puts "Error: #{param_name} wasn't an Array"
      end
end



4> Brian Warsha..:

好的,它也可以在实例方法中工作,并且,根据您的特定要求(您在评论中添加的要求),您可以这样做:

local_variables.each do |var|
  puts var if (eval(var).class != Fixnum)
end

只需替换Fixnum您的特定类型检查.

推荐阅读
oDavid_仔o_880
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有