Как удалить элемент из массива Ruby на основе его содержимого? - PullRequest
1 голос
/ 05 мая 2020

Я создаю своего рода систему переменных в Ruby, где пользователь может создать переменную. При условии, что они дают имя и содержимое переменной, он добавляет имя и строку, данные массиву, добавляя еще два элемента в массив. Вот код:

$vars = []
  def create(name, value)
    $vars << name
    $vars << value
  end

Я также хочу добавить опцию «удалить», когда пользователь вводит delete("varName") и за кулисами ищет элемент с таким же значением в массиве $vars и удаляет его. Есть какой-либо способ сделать это? Кроме того, есть ли способ получить номер элемента (например, элементы в массиве - ["a", "b", "c", "d"], и пользователь хочет удалить "d", а затем программа возвращает 3, поскольку это местоположение "d".

Ответы [ 2 ]

4 голосов
/ 05 мая 2020

A Ha sh используется для хранения пар предметов. Это быстрее и гарантирует, что имена будут уникальными.

$vars = {}
def create(name, value)
  $vars[name] = value
end

Тогда удаление будет тривиальным.

$vars.delete(name)

Как и поиск значения.

value = $vars[name]

Хэши запомните порядок, в котором были добавлены ключи. $vars.keys вернет массив имен в том порядке, в котором они были добавлены. Затем вы можете использовать find_index, чтобы получить место в списке ключей.

index = $vars.keys.find_index(name)

Помимо того, что пользователь знает порядок, в котором объявлены переменные, это не т много пользы. Переменные не имеют порядка.


Если вы хотите сделать это с массивами, сначала мы исправим create. Он сохраняет и ключ, и значение в одном массиве.

create(a, 23)
create(b, 42)

# $var = ['a', 23, 'b', 42]

Вместо этого храните каждую пару в отдельном массиве.

def create(name, value)
  $vars << [name, value]
end

create(a, 23)
create(b, 42)

# $var = [['a', 23], ['b', 42]]

Затем, чтобы удалить, выполните поиск только первых элементов каждой пары, используя index. Затем удалите этот индекс.

def delete(name)
  idx = $vars.map(&:first).index(name)
  $vars.delete_at(idx) if idx

  return idx
end

Поиск значения имени будет работать аналогично. Найдите индекс совпадающего имени, найдите эту пару, верните ее второй элемент (значение).

def find(name)
  idx = $vars.map(&:first).index(name)
  pair = $vars[idx]
  return pair[1]
end

Но не делайте этого, используйте Ha sh.

0 голосов
/ 05 мая 2020
$vars = ["name", "value", "item"]
index = $vars.index("name")
$vars.delete_at(index)

Источники:

  1. Дубликат?
  2. Редактор
  3. Документация

Хотя, если это рельсы, действительно ли стоит использовать ГЛОБАЛЬНУЮ переменную?

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