【问题标题】:How to access first item in hash value array如何访问哈希值数组中的第一项
【发布时间】:2015-11-09 08:56:31
【问题描述】:

我有一个哈希值,它的值是歌词数组(第 1 行、第 2 行等)

代码:

class Song
    def initialize(lyrics)
       @lyrics = lyrics 
    end
    def get_song_name()
        puts @lyrics.keys
    end
    def get_first_line()
        puts @lyrics.values[0]
    end
end

wasted = Song.new({"Wasted" => ["I like us better when we're wasted",
    "It makes it easier to see"]})

real_world = Song.new("Real World" => ["Straight up what do you want to learn about here", "if i was someone else would this all fall apart"])

wasted.get_song_name()
wasted.get_first_line()
#=>I like us better when we're wasted
#=>It makes it easuer to see

所以当我调用wasted.get_first_line 时,我希望它获取值数组中的第一项。我试过@lyrics.values[0],但它返回歌曲的两行而不是第一行。

我该如何做到这一点?

【问题讨论】:

  • @lyrics.values.first.first

标签: ruby-on-rails arrays ruby hash


【解决方案1】:

你需要明白,在上面的代码中@lyrics是一个Hash。以下是您正在做的事情以及它的含义:

@lyrics
# => {"Wasted"=>["I like us better when we're wasted", "It makes it easier to see"]} 


@lyrics.values
# => [["I like us better when we're wasted", "It makes it easier to see"]] 

@lyrics.values[0]
# => ["I like us better when we're wasted", "It makes it easier to see"] 

@lyrics.values[0][0]

# => "I like us better when we're wasted" 

因此,要访问第一行,您需要获取 values 数组的第一个元素。即

@lyrics.values[0][0]

@lyrics.values.first.first

【讨论】:

    【解决方案2】:

    让我们以这个哈希为例:

    x = {foo: [:bar, :baz]}
    
    x.values             # => [[:bar, :baz]]
    x.values.first       # => [:bar, :baz]
    x.values.first.first # => :bar
    

    换句话说,@lyrics.values[0] 将返回 @lyrics 哈希中的第一个值,这是两首歌曲的数组。您仍然必须从该数组中取出第一首歌曲。

    【讨论】:

      【解决方案3】:

      这不是原始问题的答案,但如果我是你,我会像下面这样修改课程。它将更倾向于将歌曲名称和歌词行存储为单独的属性,而不是将它们合并为哈希 - 这违背了拥有 Song 类的全部目的。

      class Song
          attr_accessor :song_name, :lyrics
      
          def initialize(song_name, lyrics)
             @song_name = song_name
             @lyrics = lyrics 
          end
      end
      

      请注意,您可能不需要get_first_line 方法。你总是可以使用Array#first 来达到同样的效果:

      real_world = Song.new("Real World", ["Line 1", "Line 2"])
      puts real_world.lyrics.first # Prints "Line 1"
      

      您还可以使用数组索引访问歌词行

      puts real_world.lyrics[1] # Prints "Line 2"
      

      【讨论】:

      • 好主意!只是将其更改为此设置。我只是使用最后一个作为练习哈希的一种方式。
      猜你喜欢
      • 2013-03-22
      • 1970-01-01
      • 2013-08-21
      • 2015-06-26
      • 1970-01-01
      • 1970-01-01
      • 2016-06-14
      • 1970-01-01
      • 2013-03-08
      相关资源
      最近更新 更多