我写了一个脚本,其中包含一些方法定义,没有类和一些公共(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/