在ruby中,如何声明C++;相当于;“静态”;函数变量?
我试图将一个哈希保持在一个函数的本地,该函数在调用该函数之间记住其状态。但是我不知道如何在没有闭包的情况下声明它(正如一些用户在类似的线程中建议的那样) <>我比C++更深入地了解C++,在C++中,我通常使用的是<代码>静态< /COD>局部变量,如这里的第一个例子: 我使用在ruby中,如何声明C++;相当于;“静态”;函数变量?,ruby,declaration,Ruby,Declaration,我试图将一个哈希保持在一个函数的本地,该函数在调用该函数之间记住其状态。但是我不知道如何在没有闭包的情况下声明它(正如一些用户在类似的线程中建议的那样) 我比C++更深入地了解C++,在C++中,我通常使用的是静态< /COD>局部变量,如这里的第一个例子: 我使用defined?函数成功地在ruby中破解了一些东西: def func x if not defined? @hash @hash = Hash.new end if @hash[x] puts 'sp
defined?
函数成功地在ruby中破解了一些东西:
def func x
if not defined? @hash
@hash = Hash.new
end
if @hash[x]
puts 'spaghetti'
else
@hash[x] = true
puts x.to_s
end
end
func 1
func 1
这张照片,下面是我想要的。唯一的问题是可以在该函数之外访问@hash
1
spaghetti
有没有更“干净”的方法来声明具有这种行为的变量(没有工厂)?我打算创建两个或三个变量,比如
@hash
,所以我在寻找一种更好的方法来简洁地表达这一点。您所做的在Ruby中非常常见,但也非常常见,您无需对此大惊小怪。所有@
-型实例变量仅对该实例是本地变量。请记住,“实例”通常指类的实例,但也可以指类的实例
您可以使用@
从实例的上下文引用类实例变量,但这在实践中往往会变得混乱
您要做的是以下操作之一
在方法调用之间持续存在的变量,但仅在单个对象实例的上下文中:
def func(x)
# Instance variables are always "defined" in the sense that
# they evaluate as nil by default. You won't get an error
# for referencing one without declaring it first like you do
# with regular variables.
@hash ||= { }
if @hash[x]
puts 'spaghetti'
else
@hash[x] = true
puts x.to_s
end
end
在方法调用之间持续存在的变量,但仅在所有对象实例的上下文中:
def func(x)
# Instance variables are always "defined" in the sense that
# they evaluate as nil by default. You won't get an error
# for referencing one without declaring it first like you do
# with regular variables.
@@hash ||= { }
if @@hash[x]
puts 'spaghetti'
else
@@hash[x] = true
puts x.to_s
end
end
通过将@@hash
包装到类方法中,通常可以使其更简洁。这具有使测试更容易的次要影响:
def self.func_hash
@func_hash ||= { }
end
def func(x)
if self.class.func_hash[x]
puts 'spaghetti'
else
self.class.func_hash[x] = true
puts x.to_s
end
end
你到底想干什么?将C++解决方案译成Ruby可能不是一个好主意。将“带有静态局部变量的函数”包装在一个单独的对象中可能更有意义。在我的实际问题中,我编写了一个生成第n个素数的函数
generate_prime n
,还有一个函数prime?n检查其参数是否为素数的
。这两个函数都会有很多重复的参数,所以我尝试将一些结果缓存在hash/Bignum对象中。