ruby 帮助器方法使用map创建数组,但没有创建数组?

6ju8rftf  于 2023-04-11  发布在  Ruby
关注(0)|答案(1)|浏览(112)

我是Ruby和编程的新手。我试图从Twitch中提取前20个流光,我可以做到这一点,然后我将信息格式化为我自己的哈希数组,控制台输出看起来很好,但我不能将哈希数组分配给一个变量,然后使用。
所以这个

def get_top
      top_twitch=twitch_id.get_streams({language: "en"}).data
      @top20 = 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

输出此

3.1.2 :085 > helper.get_top
 => 
[{:rank1=>                       
   {:game_name=>"Rocket League",
    :title=>"First Touch Pre-Show | RLCS Winter Major | Group Stage",
    :game_id=>"30921",
    :thumbnail=>"https://static-cdn.jtvnw.net/previews-ttv/live_user_rocketleague-{width}x{height}.jpg",
    :user_name=>"RocketLeague",
    :viewer_count=>35257}},
 {:rank2=>
   {:game_name=>"Counter-Strike: Global Offensive",
    :title=>"BLAST.tv Major Europe RMR: B Stream, Day 2 - B8 vs Fnatic",
    :game_id=>"32399",
    :thumbnail=>"https://static-cdn.jtvnw.net/previews-ttv/live_user_blast-{width}x{height}.jpg",
    :user_name=>"BLAST",
    :viewer_count=>34514}},

但是当我尝试访问数组时,它不在那里

3.1.2 :086 > top20
(irb):86:in `<main>': undefined local variable or method `top20' for main:Object (NameError)
                       
top20                  
^^^^^                  
3.1.2 :087 > @top20
 => nil
module TwitchHelper
  attr_accessor :top20

    def twitch_id
      client_id = 'xxxxxxxxxxxxxxxxxx'
      client_secret = 'xxxxxxxxxxxxxxxxxxxx'
      access_token = 'xxxxxxxxxxxxxxxxxxxxxxxxx'
        
        twitch_auth = Twitch::Client.new(
        client_id: client_id,
        client_secret: client_secret,
        access_token: access_token
        )
    end
    
    def get_top
      top_twitch=twitch_id.get_streams({language: "en"}).data
      @top20 = 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
end
bbmckpt7

bbmckpt71#

您的问题是您没有将示例变量@top20与您定义的类的特定示例相关联。
假设变量helper包含一个类示例(helper = ClassName.new(...))。
如果您已经为@top20创建了getter方法,则需要编写

helper.top20

可以通过包含示例方法来创建getter

def top20
  @top20
end

因为getter是经常需要的,Ruby提供了一个创建这个方法的快捷方式,通过包含

attr_reader :top20

这将调用类上的Module#attr_reader方法(当创建类时),该方法将创建上述getter方法。
或者,可以使用Module#attr_accessor创建getter和setter方法,方法是包含以下行

attr_accessor :top20

setter方法等价于

def top20=(x)
  @top20 = x
end

并被调用

helper.top20 = x

其中x是要分配给@top20的对象的占位符。
如果还没有为@top20创建getter方法,则需要编写

helper.instance_variable_get(:@top20)

helper.instance_variable_get("@top20")

参见Object#instance_variable_get。

相关问题