Ruby TypeError: неявное преобразование строки в целое число - PullRequest
0 голосов
/ 06 марта 2020

Я пытаюсь найти, есть ли mango/cc: в моем data, и если оно там, обновите его значение до new_version, если его там нет, добавьте mango/cc:#{new_version}

Мой data

{"product"=>"fruit", "id"=>"alpha", "details"=>{"SS"=>["mango/aa:50", "mango/cc:287_457_51.0.0"]}}

Код:

  new_version = "287_457_53.0.0"
  var1 = data['details']['SS'].select{|x| x.start_with?('mango/cc:')}
  if var1.empty?
    data['details'] << "mango/cc:#{new_version}"
  else
    data['details'].delete(var1)
    data['details'] << "mango/cc:#{new_version}"
    puts data

Токовый выход:

`[]': no implicit conversion of String into Integer (TypeError)

Ожидаемый выход:

{"product"=>"fruit", "id"=>"alpha", "details"=>{"SS"=>["mango/aa:50", "mango/cc:287_457_53.0.0"]}}

Ответы [ 2 ]

1 голос
/ 06 марта 2020

Так должно работать:

data={"product"=>"fruit", "id"=>"alpha", "details"=>{"SS"=>["mango/aa:50", "mango/cc:287_457_51.0.0"]}}
puts "Before: #{data}"
new_version = "287_457_53.0.0"
var1 = data['details']['SS'].select{|x| x.start_with?('mango/cc:')}
if var1.empty?
  data['details']['SS'] << "mango/cc:#{new_version}"
else
  data['details']['SS'].delete(var1.first)
  data['details']['SS'] << "mango/cc:#{new_version}"
end
puts "After: #{data}"

#=> Before: {"product"=>"fruit", "id"=>"alpha", "details"=>{"SS"=>["mango/aa:50", "mango/cc:287_457_51.0.0"]}}
#=> After: {"product"=>"fruit", "id"=>"alpha", "details"=>{"SS"=>["mango/aa:50", "mango/cc:287_457_53.0.0"]}}

Есть несколько ошибок:

 var1 is an array
 data ['details'] is hash table
 "mango / cc: # {new_version}" is a string

Вы должны добавить ['SS'], чтобы удалить ключ (строку) "man go / cc: # {new_version} "помня, что var1 - это массив, а не строка

0 голосов
/ 06 марта 2020

Я думаю, что ошибка в том, что var1 является массивом, поэтому ваш код должен выглядеть примерно так:

new_version = "287_457_53.0.0" 
var1 = data['details']['SS'].select{|x| x.start_with?('mango/cc:')}
if var1.empty?
  data['details'] << "mango/cc:#{new_version}"
else
  data['details'].delete(var1.first)
  data['details'] << "mango/cc:#{new_version}"
  puts data

Просто измените параметр в data['details'].delete method

...