ruby中的静态变量,就像C函数中的一样

rm5edbpk  于 2023-01-12  发布在  Ruby
关注(0)|答案(6)|浏览(186)

Ruby中有没有静态变量这样的东西,其行为会像它们在C函数中一样?
这里有一个简单的例子来说明我的意思,它会将“6\n7\n”打印到控制台。

#include <stdio.h>

int test() {
        static int a = 5;
        a++;
        return a;
}

int main() {

        printf("%d\n", test());
        printf("%d\n", test());

        return 0;
}
2uluyalo

2uluyalo1#

我对这段C代码的理解是,静态变量初始化为一个值(在本例中为5),并且其值在函数调用中保持不变。
在Ruby和具有相同抽象级别的语言中,通常可以通过使用位于函数作用域之外的变量或使用对象来保存该变量来实现这一点。

def test()
  @a ||= 5 # If not set, set it. We need to use an instance variable to persist the variable across calls.
  @a += 1 # sum 1 and return it's value
end

def main()
  puts test
  puts test
  0
end

Ruby的奇特之处在于,甚至可以在类定义之外使用示例变量。

tez616oj

tez616oj2#

与尼古加的回答相似,但更加独立:

def some_method
  @var ||= 0
  @var += 1
  puts @var
end
qyzbxkaa

qyzbxkaa3#

在方法中限定变量的范围并返回lambda

def counter
  count = 0
  lambda{count = count+1}
end

test = counter
test[]
#=>1
test[]
#=>2
ie3xauqp

ie3xauqp4#

可以使用全局变量:

$a = 5
def test
  $a += 1
end

p test #=> 6
p test #=> 7
w6lpcovy

w6lpcovy5#

在单例类中使用变量(静态类本身)

class Single
  def self.counter
    if @count  
      @count+=1
    else
      @count = 5
    end
  end
end

在ruby中,任何类都是一个只有一个示例的对象,因此,你可以在类上创建一个示例变量,它将作为一个“静态”方法工作;)
输出:

ruby 2.5.5p157 (2019-03-15 revision 67260) [x86_64-linux]

=> :counter
   Single.counter
=> 5
   Single.counter
=> 6
   Single.counter
=> 7

要在主作用域上获得此行为,您可以执行以下操作:

module Countable
  def counter
    if @count  
      @count+=1
    else
      @count = 5
    end
  end
end

=> :counter
   self.class.prepend Countable # this "adds" the method to the main object
=> Object
   counter
=> 5
   counter
=> 6
   counter
=> 7
83qze16e

83qze16e6#

我认为标准的方法是使用Fiber

f = Fiber.new do
  a = 5
  loop{Fiber.yield a += 1}
end

puts f.resume # => 6
puts f.resume # => 7
...

相关问题