如果你是一个狂热的Rails用户,你可能对ActiveSupport的Hash#except 感到熟悉,它已经存在了大约15年。从Ruby 3.0开始,Hash#except 现在也是一个原生的Ruby方法了
但是...它是做什么的呢?Hash#except给我们一个哈希值,其中不包括我们作为参数传递的所有键。让我们看一个例子:
jemma = { name: "Jemma", username: "jemma", password: "super secure" }
jemma.except(:password)
# => { name: "Jemma", username: "jemma" }
在Ruby 3.0之前,如果我们在一个没有使用Rails的repo中,我们可以做这样的事情:
jemma = { name: "Jemma", username: "jemma", password: "super secure" }
jemma.reject { |k,_| k == :password }
# => { name: "Jemma", username: "jemma" }
虽然这样做完全没问题,但如果我们试图排除多个不同的键,就会变得有点笨拙。然而,Hash#except 也可以接受多个参数:
jemma = { name: "Jemma", username: "jemma", password: "super secure" }
jemma.except(:name, :password)
# => { username: "jemma" }
Hash#except Hash#slice 会给我们一个包含键/值对的散列,这些键是我们指定的参数,而 会给我们一个包含键/值对的散列,这些键不是我们指定的参数。Hash#except
我们可能会想,如果我们传递一个不在哈希中的键会怎样?
jemma = { name: "Jemma", username: "jemma", password: "super secure" }
jemma.except("key doesn't exist")
# => { name: "Jemma", username: "jemma", password: "super secure" }
在这种情况下,Ruby在技术上仍然将这个键从我们的哈希中排除 - 它只是一开始就没有出现在哈希中。(这与Hash#slice...的行为相同)。