设置名称存储在变量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