ruby - 如何在 Ruby 中只执行一次方法?有静态变量吗?

标签 ruby static

我写了一个脚本,其中包含一些方法定义,没有类和一些公共(public)代码。其中一些方法执行一些非常耗时的 shell 程序。然而,这些shell程序只需要在第一次调用该方法时执行。

现在在 C 中,我会在每个方法中声明一个静态变量,以确保这些程序只执行一次。我怎么能在 Ruby 中做到这一点?

最佳答案

ruby 中有一个成语:x ||= y

def something
  @something ||= calculate_something
end

private

def calculate_something
  # some long process
end

但是如果您的“长时间运行的实用程序”可能会返回一个错误值(false 或 nil),那么这个习惯用法就会有问题,因为 ||= 运算符仍然会导致右侧为评估。 如果您期望 false 值,则使用一个额外的变量,其方式类似于 DigitalRoss 提议的方式:

def something
  return @something if @something_calculated
  @something = calculate_something
  @something_calculated = true
  return @something
end

不要试图通过先设置@something_calculated 变量然后运行calculate_something 来节省一行代码。如果您的计算函数引发异常,您的函数将始终返回 nil 并且永远不会再次调用计算。

更一般地说,在 Ruby 中您使用实例变量。但是请注意,它们在给定对象的所有方法中都是可见的——它们不是方法的本地方法。 如果你需要一个所有实例共享的变量,在类对象中定义方法,并在每个实例中调用 self.class.something

class User
  def self.something
    @something ||= calculate_something
  end

  def self.calculate_something
    # ....
  end

  def something
    self.class.something
  end
end

关于ruby - 如何在 Ruby 中只执行一次方法?有静态变量吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4096931/

相关文章:

ruby - JRuby "no such file to load"

ruby - 转储类似 YAML 的哈希键名

ruby-on-rails - postgresql 和 FoR - 如何查询值在数组中的 json 类型字段

ruby-on-rails - RoR - 关闭 form_tag

ruby-on-rails - 捆绑控制台因未初始化常量 Rails 而失败

ios - 3D Touch 静态快捷键

Java:访问静态方法

C++如何初始化包含互斥锁的类的静态变量

Java - 数组列表

java - "this"对象与非静态对象