设置名称存储在变量B中的变量A.

我有以下两个变量:

a = 1;
b = 'a';

我希望能够做到

SOMETYPEOFEVALUATION(b) = 2;

所以变量a的值现在设置为2

a # => 2 

这可能吗?

具体来说,我正在使用Facebook API。 每个对象都有各种不同的连接(朋友,喜欢,电影等)。 我有一个解析器类,用于存储所有这些连接的最后一次调用Facebook API的状态。 这些状态都被命名为与您必须调用以更新它们的GET相对应的状态。

例如,要更新音乐连接,请使用https://graph.facebook.com/me/music?access_token = ...我将结果存储在名为updated_music的变量中。 对于书籍,其updated_books。 如果我创建了所有这些连接类型名称的列表,我最好想做这样的事情。

def update_all
  connection_list.each do |connection_name|
    updated_SomeTypeOfEvalAndConcatenation(connection_name) = CallToAPI("https://graph.facebook.com/me/#{connection_name}?access_token=...")
    end
end

对于Rails和StackOverflow来说都很新,所以请让我知道是否有更好的方法来遵循任何约定。

试了下面。

class FacebookParser

attr_accessor   :last_albums_json,         

  def update_parser_vars(service)
     handler = FacebookAPIHandler.new
     connections_type_list = ['albums']
     connections_type_list.each do |connection_name|
       eval "self.last_#{connection_name}_json = handler.access_api_by_content_type(service, #{connection_name})['data']"
     end
    #self.last_albums_json = handler.access_api_by_content_type(service, 'albums')['data']
   end


 end

我得到这个错误

undefined local variable or method `albums' for #<FacebookParser:0xaa7d12c>

当我使用被注释掉的行时可以正常工作。


怎么样

eval "#{b}=2"

和实例变量,你也可以做instance_variable_set("@name", value)

编辑:

如果你定义了一个setter(你有),你也可以使用send方法,试试这个:

class FacebookParser
  attr_accessor   :last_albums_json,         

  def update_parser_vars(service)
    handler = FacebookAPIHandler.new
     connections_type_list = ['albums']
     connections_type_list.each do |connection_name|
       send("last_#{connection_name}_json=", 
         handler.access_api_by_content_type(
           service, connection_name)['data']))
     end
  end
end

你原来的代码有问题

eval ".... handler.access_api_by_content_type(service, #{connection_name})"

会执行

... handler.access_api_by_content_type(service, albums)
# instead of
... handler.access_api_by_content_type(service, 'albums')

所以你必须写

eval ".... handler.access_api_by_content_type(service, '#{connection_name}')" <- the quotes!

这就是人们通常避免使用eval的原因 - 这种错误很容易发生


像这样改变一个不相关的变量有点代码味道; 大多数程序员都不喜欢它,当一个变量奇迹般地改变值时,至少不是不在一个封闭类中。

在这个简单的例子中,说更常见的是:

a=something(b)

或者,如果a是更复杂的事情,那就把它变成一个班级:

class Foo
  attr_accessor  :a

  def initialize(value)
    @a = value
  end

  def transform(value)
    @a = "new value: #{value}"
  end
end

baz = "something"
bar = Foo.new(2)
bar.a
=> 2
bar.transform(baz)
bar.a
=> "new value: something"

因此,尽管第二个示例更改了内部变量,但不通过访问者,但至少它是具有有限API的封装对象的一部分。

更新啊,我认为问题是如何做像php的变量变量。 正如穆建议,如果你想这样做,你可能做错了事情......这是一个永远不会想到的概念。 使用类或哈希等。


这些东西通常不是在Ruby中使用局部变量和它们的名字来完成的。 通常的方法可能包括哈希和符号:

data = Hash.new
data[:a] = 1 # a = 1
b = :a       # b = 'a'

然后,稍后

data[b] = 2  # SOMETYPEOFEVALUATION(b) = 2
data[:a]     # => 2
链接地址: http://www.djcxy.com/p/25765.html

上一篇: Setting variable A with name stored in variable B

下一篇: Checking if a variable is defined?