我正在 Ruby 中创建一种变量系统,用户可以在其中创建变量。如果它们给出变量名称和内容,它会将给定的名称和字符串添加到数组中,从而向数组中添加另外两个项目。代码如下:
$vars = []
def create(name, value)
$vars << name
$vars << value
end
我还想添加一个“删除”选项,用户在其中输入 delete("varName")
并在幕后搜索 $ 中具有相同值的项目vars
数组并删除它。有什么办法可以做到这一点吗?另外,有什么方法可以获取项目的数量(例如数组中的项目是 ["a", "b", "c", "d"]
并且用户想要删除"d"
,然后程序返回 3,因为那是 "d"
的位置。
最佳答案
一个Hash用于存储成对的项目。它速度更快,并且保证名称是唯一的。
$vars = {}
def create(name, value)
$vars[name] = value
end
那么删除就很简单了。
$vars.delete(name)
就像寻找值(value)一样。
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
但不要这样做,使用哈希。
关于arrays - 如何根据 Ruby 数组的内容删除项目?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61602484/