gpt4 book ai didi

ruby - ruby 运算符 ||= 是智能的吗?

转载 作者:数据小太阳 更新时间:2023-10-29 06:34:36 24 4
gpt4 key购买 nike

我对 ruby​​ 中的 ||= 语句有疑问,我对它特别感兴趣,因为我正在使用它写入内存缓存。我想知道的是,||= 是否首先检查接收器以查看它是否在调用该 setter 之前已设置,或者它实际上是 x = x || 的别名y

这在普通变量的情况下并不重要,但使用类似的东西:

CACHE[:some_key] ||= "Some String"

可能会执行内存缓存写入,这比简单的变量集更昂贵。奇怪的是,我在 ruby​​ api 中找不到关于 ||= 的任何信息,所以我自己无法回答这个问题。

我当然知道:

CACHE[:some_key] = "Some String" if CACHE[:some_key].nil?

会实现这个,我只是在寻找最简洁的语法。

最佳答案

这非常容易测试:

class MyCache
def initialize
@hash = {}
end

def []=(key, value)
puts "Cache key '#{key}' written"
@hash[key] = value
end

def [](key)
puts "Cache key '#{key}' read"
@hash[key]
end
end

现在只需尝试 ||= 语法:

cache = MyCache.new
cache["my key"] ||= "my value" # cache value was nil (unset)
# Cache key 'my key' read
# Cache key 'my key' written

cache["my key"] ||= "my value" # cache value is already set
# Cache key 'my key' read

因此我们可以得出结论,如果缓存键已经存在,则不会发生任何分配。

以下摘自 Rubyspec shows这是设计的,不应依赖于 Ruby 实现:

describe "Conditional operator assignment 'obj.meth op= expr'" do
# ...
it "may not assign at all, depending on the truthiness of lhs" do
m = mock("object")
m.should_receive(:foo).and_return(:truthy)
m.should_not_receive(:foo=)
m.foo ||= 42

m.should_receive(:bar).and_return(false)
m.should_not_receive(:bar=)
m.bar &&= 42
end
# ...
end

在同一个文件中,[][]= 有类似的规范,要求相同的行为。

虽然 Rubyspec 仍在进行中,但很明显,主要的 Ruby 实现项目打算遵守它。

关于ruby - ruby 运算符 ||= 是智能的吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2989862/

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