gpt4 book ai didi

ruby - 如何编写惰性评估 switch 语句?

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

很长一段时间以来,我都在拼命地尝试让它工作,我用谷歌搜索,我进行了修补,并询问了一些本地的 Ruby 专家(虽然不是 pdx.rb,但我确实应该这样做)。

我们在工作中试图做这样的事情:

case user.roles.included? (... magic ...) 
when ['admin', 'editor']
then ...
when ['anonymous']
then ...
end

所以你可以看到它感觉如何像一个 case,但是因为它没有像 El 指出的那样使用 ===,所以它不起作用。我知道我可以使用 if 但它感觉像是应该使用 case 的地方。

最佳答案

when 使用 === 运算符比较给 case 的值和给 when 的参数>。此外 then 出现在与 when 语句不同的行时也没有必要。您要执行的操作的正确代码是:

case x
when 16
puts 'hi'
when Object
puts 'obj'
end

至于问题的新增内容:

case user.roles.included? (... magic ...) 
when ['admin', 'editor']
...
when ['anonymous']
...
end

这不起作用,因为 Array 的 === 没有映射到 include。我不确定 Array 的 === 运算符来自何处,甚至不确定它的作用,但您可以覆盖它以提供您想要的功能。

根据上面的代码判断,如果其中一个用户角色与数组匹配,您希望 case 触发。这将覆盖 Array#=== 来做到这一点:

class Array
def === other_array
! (other_array & self).empty?
end
end

case user.roles
when ['admin', 'editor']
...
when ['anonymous']
...
end

警告:根据您覆盖 Array#=== 的位置,这可能会产生无法预料的后果,因为它会更改该范围内的所有数组。鉴于 === 是从 Object 继承的,它是 == 的别名,我不认为它会成为一个大问题。

新的===与旧的===不同的地方:

  • 如果任一数组是另一个数组的子集或重新排序,新的 === 将返回 true。
  • 旧的 === 只会在两个数组相同(顺序和内容)时返回 true。

据我所知,case/when 是唯一可以在数组上隐式调用 === 的情况。

关于ruby - 如何编写惰性评估 switch 语句?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1757520/

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