Ruby - NoMethodError, но почему только иногда? - PullRequest
0 голосов
/ 17 мая 2018

Я работаю над сценарием, чтобы получить комментарии для субредита, выделить отдельные слова, сосчитать их и отсортировать. Примерно в 70% случаев я получаю эту ошибку:

in `<main>': undefined method `map' for nil:NilClass (NoMethodError) Did you mean?  tap

Примерно в 30% случаев сценарий работает как задумано. Почему это происходит? И как бы вы решили? Я новичок в программировании, поэтому не удивлюсь, если проблема будет основной. Вот мой код:

require 'net/http'
require 'rubygems'
require 'json'

# Pull json file, parse out comments
url = 'https://www.reddit.com/r/askreddit/comments.json?sort=top&t=all&limit=100'
uri = URI(url)
response = Net::HTTP.get(uri)
json = JSON.parse(response)

comments = json.dig("data", "children").map { |child| child.dig("data", "body") }

#Split words into array
words = comments.to_s.split(/[^'\w]+/)

words.delete_if { |a,_| a.length < 5}

#count and sort words
count = Hash.new(0)
words.each { |word| count.store(word, count[word]+1)}
count.delete_if { |_,b| b < 4}
sorted = count.sort_by { |word,count| count}.reverse
puts sorted

Ответы [ 2 ]

0 голосов
/ 17 мая 2018

Существует ошибка на стороне Reddit.Я написал обходной путь, но иногда он имеет небольшую задержку;он пытается снова и снова, пока не добьется успеха. Отредактировано (в основном) в соответствии с вашим исходным кодом.

require 'net/http'
require 'rubygems'
require 'json'

# Pull json file, parse out comments
url = 'https://www.reddit.com/r/askreddit/comments.json?sort=top&t=all&limit=100'
uri = URI(url)
error = true
while error
   response = Net::HTTP.get(uri)
   json = JSON.parse(response)
   error = json["error"]
end

comments = json.dig("data", "children").map { |child| child.dig("data", "body") }

#Split words into array
words = comments.to_s.split(/[^'\w]+/)

words.delete_if { |a,_| a.length < 5}

#count and sort words
count = Hash.new(0)
words.each { |word| count.store(word, count[word]+1)}
count.delete_if { |_,b| b < 4}
sorted = count.sort_by { |word,count| count}.reverse
puts sorted
0 голосов
/ 17 мая 2018

Похоже, ваш json.dig("data", "children") иногда возвращает nil.Одним из способов изящно справиться с этим является использование оператора безопасной навигации (&.) :

comments = json.dig("data", "children")&.map { |child| child.dig("data", "body") }

if comments
  # your other logic with comments here
else
  {}
end
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...