【问题标题】:How can I remove an item in a Ruby array based on its content?如何根据内容删除 Ruby 数组中的项目?
【发布时间】:2020-05-04 22:10:53
【问题描述】:

我正在 Ruby 中创建一种变量系统,用户可以在其中创建变量。如果他们提供变量名称和内容,它会将给定的名称和字符串添加到数组中,从而向数组中添加另外两个项目。代码如下:

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

我还想添加一个“删除”选项,其中用户键入delete("varName") 并在后台搜索$vars 数组中具有相同值的项目并将其删除。有没有办法做到这一点?另外,有什么方法可以获取项目的编号(例如,数组中的项目是["a", "b", "c", "d"],用户想要删除"d",然后程序返回3,因为那是"d"的位置。

【问题讨论】:

  • 自 Ruby v1.8 起,无法动态创建局部变量。
  • 数组中的项目不会是["a", "b", "c", "d"]。他们将是["a", "a's value", "b", "b's value", ...]
  • 尽量远离 Ruby 中的全局变量远离。它们以$ 为前缀,并且只应在特殊情况下使用。这样做的 Ruby 方法,假设不是 XY Problem 有更好的解决方案,是创建一个带有 @vars 实例变量的类,然后使用像 create 这样的对象实例方法来操作它,或者,甚至更好, []=(name, value)。我不知道这与哈希有何不同。
  • 值得注意的是,Ruby 已经可以使用instance_variable_setlocal_variable_set 创建实际变量。你不需要伪造它。

标签: arrays ruby


【解决方案1】:

Hash 用于存储成对的项目。它更快,并且保证名称是唯一的。

$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

但不要这样做,使用哈希。

【讨论】:

    【解决方案2】:
    $vars = ["name", "value", "item"]
    index = $vars.index("name")
    $vars.delete_at(index)
    

    来源:

    1. Duplicate?
    2. Editor
    3. Documentation

    虽然这是 rails,但使用 GLOBAL 变量真的是个好主意吗?

    【讨论】:

    • @theTinMan 链接描述了我链接的内容......和编辑器......索引的文档和可能重复的来源......有什么问题?
    • 问题是,链接腐烂然后断开。 它们破裂时,这会告诉我们什么?相反,您应该总结您尝试建立的链接的重要点,并适当归因,以便链接断开时,答案仍然有意义。我们回答的问题,不是针对提问的人,而是针对那些正在寻找未来解决方案的人。想象一下链接断开的答案。它会有多大用处?
    • @theTinMan 明白了。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-07-19
    • 1970-01-01
    • 1970-01-01
    • 2021-06-18
    • 2020-10-19
    • 1970-01-01
    相关资源
    最近更新 更多