gpt4 book ai didi

ruby - 如何根据数组处理结果给变量赋值

转载 作者:太空宇宙 更新时间:2023-11-03 17:13:29 24 4
gpt4 key购买 nike

对于这种微不足道的任务,是否有更好的解决方案?

给定一个字符串数组如下:

roles = [
"id=Accountant,id=TOTO,id=client",
"id=Admin,id=YOYO,id=custom",
"id=CDI,id=SC"
]

要根据其 id 值提取角色值,我使用以下正则表达式来匹配它:

r =~ /id=Admin/

愚蠢的简单解决方案就是迭代 roles 数组,分配匹配的值并返回它,如下所示:

role = nil
roles.each do |r|
role = 'admin' if r =~ /id=Admin/
role = 'national' if r =~ /id=National/
role = 'local' if r =~ /id=Local/
end

role

有更好的解决方案吗?

最佳答案

你可以定义一个 regular expression一次匹配多个角色。这是一个简单的例子:

/id=(Admin|National|Local)/

括号充当角色名称的捕获组。您可能想要添加 anchor ,例如只匹配每行中的第一个 id=value 对。或者确保您匹配整个值而不是仅匹配开头(如果这些可能不明确的话)。

然后可以将模式传递给 grep它返回匹配的行:

roles.grep(/id=(Admin|National|Local)/)
#=> ["id=Admin,id=YOYO,id=custom"]

将 block 传递给 grep 允许我们转换匹配项:($1 指的是第一个捕获组)

roles.grep(/id=(Admin|National|Local)/) { $1.downcase }
#=> ["admin"]

获取first作用:

roles.grep(/id=(Admin|National|Local)/) { $1.downcase }.first
#=> "admin"

如果你的数组很大,你可以使用 lazy在第一次匹配后将停止遍历的枚举器:

roles.lazy.grep(/id=(Admin|National|Local)/) { $1.downcase }.first
#=> "admin"

关于ruby - 如何根据数组处理结果给变量赋值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58500749/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com