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

时间:2013-03-17 23:54:52

标签: ruby

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;
}

6 个答案:

答案 0 :(得分:3)

将变量放在方法中并返回lambda

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

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

答案 1 :(得分:2)

在ruby中没有变量static声明,其中变量get绑定到定义它的函数的上下文,但是您可以使用实例变量将变量绑定到对象的上下文。这就是我将你的代码翻译成ruby的方法:

def test
  @a ||= 0 # if instance variable @a is not defined, define it as `0`
  @a += 1
end

def print_numbers
  2.times { puts test }
end

这些函数与全局上下文相关联,但如果用作实例方法,也会起作用。使用“禁忌”全局变量可以获得类似的结果:

def test
  $a ||= 0 # if instance variable @a is not defined, define it as `0`
  $a += 1
end

def print_numbers
  2.times { puts test }
end

但是,在Ruby或任何其他语言中,没有人喜欢全局变量。很难知道他们在哪里设置。

答案 2 :(得分:2)

与nicooga的答案类似,但更独立:

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

答案 3 :(得分:1)

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

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

答案 4 :(得分:0)

您可以使用全局变量:

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

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

答案 5 :(得分:0)

我认为执行此操作的标准方法是使用Fiber

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

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