Есть ли способ в Ruby увеличить переменную объекта Struct внутри массива? - PullRequest
0 голосов
/ 14 февраля 2020
Namepoints = Struct.new(:name, :points)

def arraytesting2()

  x = Namepoints.new("Seasons", 1)
  array = []
  255.times do

    unless array.include? x.name
      array << x.name
      array << x.points
    else
      array[array.index(x.points) + 1 ]
    end
  end
  print array.to_s.gsub(/[\[\]"]/, "")
end

arraytesting2

Результат: Времена года, 1

Ожидаемый результат: Времена года, 255

array[array.index(x.points) + 1 ] не будет увеличиваться?

Также предпринимаются другие попытки: array[array.index(x.points + 1 )] получает ошибку преобразования

Ответы [ 2 ]

0 голосов
/ 14 февраля 2020

Проще использовать Array#index, чем Array#include?.

Namepoints = Struct.new(:name, :points)

def arraytesting2(x)
  255.times.each_with_object([]) do |_, array|
    if found = array.index(x.name)
      array[found + 1] += 1 # points are right after
    else
      array << x.name << x.points
    end
  end
end

arraytesting2(Namepoints.new("Seasons", 1))
#⇒ ["Seasons", 255]
0 голосов
/ 14 февраля 2020

Итак, вы пытаетесь увеличить значение массива, найденного по данному индексу.

Индекс array.index(x.points).

Вы можете сделать это следующим образом:

array[array.index(x.points)] += 1

То, что делал ваш код, получило доступ к значению индекса, найденного после array.index(x.points):

array[array.index(x.points) + 1]

Однако обратите внимание, что это все равно не будет печататься

Seasons, 255

Причина в том, что после первой итерации массив будет содержать:

['Seasons', 2]

И значение точек имени по-прежнему равно 1. Поэтому в следующий раз, когда вы будете искать 1, вы не найдете его.


Чтобы это исправить, это зависит от того, чего вы пытаетесь достичь. Либо увеличьте значение в именных точках, либо используйте ha sh вместо массива. Я не понимаю, зачем вам нужен массив.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...