làm cách nào để lặp lại một chuỗi băm trong ruby


81

OK, vậy tôi có hàm băm này

 h
 => {"67676.mpa"=>{:link=>"pool/sdafdsaff", :size=>4556}} 

>  h.each do |key, value|
>     puts key
>   puts value
>   end
67676.mpa
linkpool/sdafdsaffsize4556

làm cách nào để truy cập các giá trị riêng biệt trong giá trị băm trên vòng lặp


1
Bạn muốn xem đầu ra là gì?
Mark Thomas

các shingara appcoach được sử dụng làm việc ra lớn .... tôi phải của rút ra một trống ... câu trả lời là ngay trước mặt tôi ... tôi đã phải làm một vòng lặp bên trong
Matt Elhotiby

Ai cũng biết kết quả của việc đặt hàm băm là khá vô dụng, bạn đã thử "đặt hàm băm" chưa?
tokland

Câu trả lời:


160

Giá trị là một Hash để bạn cần lặp lại trên nó hoặc bạn chỉ có thể nhận các giá trị: -

h.each do |key, value|
  puts key
  value.each do |k,v|
    puts k
    puts v
  end
end

hoặc là

h.each do |key, value|
  puts key
  value.values.each do |v|
    puts v
  end
end


ở đây điều gì xảy ra nếu chìa khóa không được sử dụng ở bất cứ đâu? . chúng ta có cần đặt một ?chỗ của chìa khóa không? ví dụ: |?, array|cú pháp này có hợp lệ Rubykhông?
huzefa biyawarwala

@huzefabiyawarwala nếu phím không được sử dụng trong các lần lặp bạn nên tiền tố nó với một dấu gạch dưới như vậy|_key, value|
Severin

17

Bạn sẽ muốn đệ quy thông qua hàm băm, đây là một phương pháp đệ quy:

def ihash(h)
  h.each_pair do |k,v|
    if v.is_a?(Hash)
      puts "key: #{k} recursing..."
      ihash(v)
    else
      # MODIFY HERE! Look for what you want to find in the hash here
      puts "key: #{k} value: #{v}"
    end
  end
end

Sau đó, bạn có thể lấy bất kỳ hàm băm nào và chuyển nó vào:

h = {
    "x" => "a",
    "y" => {
        "y1" => {
            "y2" => "final"
        },
        "yy1" => "hello"
    }
}
ihash(h)

ở đây nếu chìa khóa không được sử dụng ở đâu thì sao? . chúng ta có cần đặt một ?chỗ của chìa khóa không? ví dụ: |?, array|cú pháp này có hợp lệ không?
huzefa biyawarwala

Giữ nó, chỉ cần không sử dụng nó. dấu hỏi không hợp lệ.
Travis Reeder

7

Tôi đã cải thiện một chút câu trả lời của Travis, còn ý chính này thì sao:

https://gist.github.com/kjakub/be17d9439359d14e6f86

class Hash

  def nested_each_pair
    self.each_pair do |k,v|
      if v.is_a?(Hash)
        v.nested_each_pair {|k,v| yield k,v}
      else
        yield(k,v)
      end
    end
  end

end

{"root"=>{:a=>"tom", :b=>{:c => 1, :x => 2}}}.nested_each_pair{|k,v|
  puts k
  puts v
}

@Travis R cải thiện câu trả lời
Jakub Kuchar

5

Cách đơn giản nhất để tách cả ba giá trị trong trường hợp này sẽ như sau:

h.each do |key, value|
  puts key
  puts value[:link]
  puts value[:size]
end

2

Bạn có thể truy cập trực tiếp các giá trị của hàm băm bằng cách gọi hash.values. Trong trường hợp này, bạn có thể làm điều gì đó như

> h = {"67676.mpa"=>{:link=>"pool/sdafdsaff", :size=>4556}}
> h.values.each do |key, value|
>   puts "#{key} #{value}"
> end

link pool/sdafsaff
size 4556
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.