gpt4 book ai didi

ruby - 双管||之间有什么实际区别吗?和 Ruby 中的单例?

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

我昨天在阅读有关 Ruby 的文章并接触到单例的概念,其中提到用于避免多次实例化一个类。

我以前不知道这个概念,但是当我想实现这个目的时,我创建了一个全局变量并使用了双管道 ||反而。

例如:

@browser ||= Browser.new

在某些情况下是否有任何区别或优势可以使单例的使用更好?

最佳答案

||= 用于memoize一个值。例如,如果您有一个方法执行昂贵的操作或返回不同的值:

class Foo
def now
Time.now
end
end

f = Foo.new
f.now #=> 2018-06-21 11:59:56 +0200
f.now #=> 2018-06-21 11:59:59 +0200
f.now #=> 2018-06-21 12:00:02 +0200

如果您想缓存该值,||= 是您的 friend :

class Foo
def now
@now ||= Time.now
end
end

f = Foo.new
f.now #=> 2018-06-21 11:59:56 +0200
f.now #=> 2018-06-21 11:59:56 +0200
f.now #=> 2018-06-21 11:59:56 +0200

第一个调用调用 Time.now 并将结果分配给 @now。随后的调用只返回 @now 而不计算右侧。因此,Time.now只被调用一次,方法的返回值不再改变。

因为 @now 是一个实例变量,每个实例存储一个单独的值:

f = Foo.new
f.now #=> 2018-06-21 11:59:56 +0200
f.now #=> 2018-06-21 11:59:56 +0200
f.now #=> 2018-06-21 11:59:56 +0200

g = Foo.new
f.now #=> 2018-06-21 12:00:02 +0200
f.now #=> 2018-06-21 12:00:02 +0200
f.now #=> 2018-06-21 12:00:02 +0200

A singleton另一方面确保给定类(每个进程)有一个(且只有一个)实例,例如:

require 'singleton'

class Foo
include Singleton

def now
@now ||= Time.now
end
end

f = Foo.instance
f.now #=> 2018-06-21 11:59:56 +0200
f.now #=> 2018-06-21 11:59:56 +0200

g = Foo.instance
g.now #=> 2018-06-21 11:59:56 +0200
g.now #=> 2018-06-21 11:59:56 +0200

那是因为 fg 指的是同一个对象。包括Singleton删除通过 newallocate 创建任何其他实例的能力:

Foo.new      #=> NoMethodError
Foo.allocate #=> NoMethodError

关于ruby - 双管||之间有什么实际区别吗?和 Ruby 中的单例?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50964805/

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