在ruby中,如何声明C++;相当于;“静态”;函数变量?

在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

我试图将一个哈希保持在一个函数的本地,该函数在调用该函数之间记住其状态。但是我不知道如何在没有闭包的情况下声明它(正如一些用户在类似的线程中建议的那样)

<>我比C++更深入地了解C++,在C++中,我通常使用的是<代码>静态< /COD>局部变量,如这里的第一个例子:

我使用
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对象中。