新手问题 ruby 中"变量的变量"如何表示

daweiba · October 09, 2012 · Last by woaigithub replied at October 09, 2012 · 2940 hits

例如 php 中的以下语法如何表达

1

$var = "name";
$name = "Jobs";
echo ${$var} ;   // Jobs

2

class obj{
   var $name ;
   //
}
$obj = new obj;
$obj->name = "Jobs" ;

$var = "name";

echo $obj->$var ;  // Jobs

2

class obj{
   var $name ;
   //
}
class obj2{
   var $var;
   //
}
$obj = new obj;
$obj->name = "Jobs" ;

$obj2 = new obj2;
$obj2->var = "name" ;

echo $obj->{$obj2->var} ;  // Jobs

第一个可以用 eval 来实现吧:

[4] pry(main)> var = "name"
=> "name"
[5] pry(main)> name = "Jobs"
=> "Jobs"
[6] pry(main)> p eval(var)
"Jobs"

Another :

[8] pry(main)> class Test
[8] pry(main)*   attr_accessor :name
[8] pry(main)* end 

[12] pry(main)> class Demo
[12] pry(main)*   attr_accessor :var
[12] pry(main)* end 

test = Test.new
test.name = "Jobs"

demo = Demo.new
demo.var = "name"

[15] pry(main)> test.instance_eval(demo.var)
=> "Jobs"
  1. 这个貌似只想到了用 eval 方法解决
  2. 可以用 instance_variable_get 方法来解决
    http://apidock.com/ruby/v1_9_3_125/Object/instance_variable_get ruby class Fred def initialize(p1, p2) @a, @b = p1, p2 end end fred = Fred.new('cat', 99) fred.instance_variable_get(:@a) #=> "cat" fred.instance_variable_get("@b") #=> 99

#3 楼 @cxh116 第一种情况也一样啊

@a = 1
instance_variable_get(:@a)

#4 楼 @hooopo 第一种情况更加像是局部变量,这个要问一下 @daweiba ,对 php 不熟悉

这个可以用 method 和 instance_variable_get 来模拟:

module Var
  def &(name)
    meth = method(name).call
  rescue NameError => e
    instance_variable_get "@#{name}"
  end
end

class Obj
  include Var

  def initialize
    @name = "Jobs"
  end

  def age
    56
  end
end

var = "name"
puts Obj.new.&(var)

var = "age"
puts Obj.new.&(var)

@daweiba 如果你是新来 Ruby, 元编程就是把代码作为数据来处理,“变量的变量”是这个的应用之一。

eval 这个东西,好多脚本都有。 我理解就是拼接代码,动态拼接代码,然后叫给 eval 解释,进而执行一下。

You need to Sign in before reply, if you don't have an account, please Sign up first.