是否可以在ruby循环中增加符号键的名称?

时间:2013-10-09 19:16:56

标签: ruby-on-rails ruby

我正在尝试打印n并在符号键的末尾标记它,每次n递增;那可能吗?

这是代码部分......

# User info
client = Instagram.client(:access_token => session[:access_token])
@user = Hash.new
@user[:info] = client.user

# User media
@user[:recent_media] = Hash.new
@user[:recent_media][:p1] = client.user_recent_media
# user_recent_media only ever retrieves in 20 out of x image links; x being total profile images

(1..9).each do |n|
  page_max_id = @user[:recent_media][:p<n>].pagination.next_max_id
  return if page_max_id.nil?
  @user[:recent_media][:p<n+1>] = client.user_recent_media(max_id: page_max_id)
end

6 个答案:

答案 0 :(得分:4)

您希望避免在此处使用符号作为键,因为您正在动态生成它们。符号永远不会被垃圾收集,因此会导致内存泄漏。如果你可以改为字符串,你可以进行字符串插值,例如"p#{n + 1}"。否则,最后使用.to_sym做同样的事情会有效,但要注意。

答案 1 :(得分:2)

当然,你可以象征字符串。尝试使用:"p#{n}""p#{n}".to_sym

答案 2 :(得分:2)

:p1:p2,... - 这些不是变量,而是符号。您可以构造一个字符串,然后将其转换为符号,如下所示:

@user[:recent_media]["p#{n + 1}".to_sym] = ...

你应该知道这种技术会导致内存泄漏,因为一旦创建了符号,就无法进行垃圾回收。

答案 3 :(得分:1)

(1..9).each do |n|
  page_max_id = @user[:recent_media]["p#{n}".to_sym].pagination.next_max_id
  return if page_max_id.nil?
  @user[:recent_media]["p#{n+1}".to_sym] = client.user_recent_media(max_id: page_max_id)
end

答案 4 :(得分:1)

您可以使用:

@user[:recent_media][:"p#{n+1}"] = #...

来自documentation

  

您也可以通过插值创建符号:

:"my_symbol1"
:"my_symbol#{1 + 1}"

答案 5 :(得分:0)

to_sym是你的朋友!

@user[:recent_media]["p#{n+1}".to_sym] = client.user_recent_media(max_id: page_max_id)