2013-03-17 150 views
0

Ruby中的静态变量是否存在像C函数中那样的行为?像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; 
} 

回答

3

范围你的方法和返回拉姆达

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

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

我接受这个,因为它看起来最接近我所问。谢谢! – conradkdotcom 2013-03-18 01:43:36

+0

a.k.a * clojure * – 2013-03-18 02:01:54

+0

@DavidUnric关闭?相反,clojure语言? – texasbruce 2013-03-18 03:44:40

0

您可以使用全局变量:

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

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

Ruby中有没有变量static声明,其中变量获取的绑在它被定义的功能的情况下,但你可以打个变量对使用实例变量的对象的上下文。这是我会怎么你的代码翻译成红宝石:

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

到nicooga的答案,但类似的更自足:

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

可变我认为做这样的标准方法是使用Fiber

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

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