Ruby中使用map创建数组无法赋值给变量的问题求助
问题分析
核心问题是实例变量的作用域误解:
@top20是TwitchHelper模块实例(即你创建的helper对象)的专属实例变量,不属于全局或main对象。- 你在irb中直接输入
@top20,访问的是main对象的实例变量(默认nil);输入top20则是访问未定义的局部变量,因此报错。
解决方案
1. 正确访问实例变量
调用get_top后,通过helper对象访问top20(你已定义attr_accessor :top20,它自动生成了top20 getter方法):
3.1.2 :085 > helper.get_top # 输出格式化后的数组... 3.1.2 :086 > helper.top20 # 此处将返回目标哈希数组
2. 优化get_top方法(更直观的写法)
让方法直接返回结果,无需依赖实例变量,使用时直接赋值:
def get_top top_twitch = twitch_id.get_streams({language: "en"}).data top_twitch.each_with_index.map do |s, idx| { "rank#{idx+1}": { game_name: s.game_name, title: s.title, game_id: s.game_id, thumbnail: s.thumbnail_url, user_name: s.user_name, viewer_count: s.viewer_count } } end end
使用示例:
3.1.2 :085 > top20 = helper.get_top # 直接将结果赋值给局部变量top20 3.1.2 :086 > top20 # 正常访问数组内容
3. 优化twitch_id方法(避免重复创建客户端)
当前twitch_id方法每次调用都会新建Twitch::Client实例,建议缓存以提升效率:
def twitch_id @twitch_id ||= Twitch::Client.new( client_id: 'xxxxxxxxxxxxxxxxxx', client_secret: 'xxxxxxxxxxxxxxxxxxxx', access_token: 'xxxxxxxxxxxxxxxxxxxxxxxxx' ) end
@twitch_id ||= ... 表示仅当@twitch_id未初始化时,才创建新客户端实例。
内容的提问来源于stack exchange,提问作者jayecin
相关产品推荐
相关产品推荐

