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;
}
答案 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
...