3

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

6 回答 6

4

Ruby中没有与 C 变量等效的语法static,而且我从未在具有相似抽象级别的语言中看到类似的东西,例如 Javascript、Python、Elixir 等。

我对这段 C 代码的理解是,第一次调用函数时,编译器会用初始值初始化变量。后续调用只会获取变量的当前值。

这就是我用红宝石术语翻译相同逻辑的方式:

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

这也适用于课堂之外。

于 2013-03-18T00:02:06.650 回答
3

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

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

test = counter
test[]
#=>1
test[]
#=>2
于 2013-03-18T00:08:24.267 回答
3

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

def some_method
  @var ||= 0
  @var += 1
  puts @var
end
于 2013-03-18T00:04:29.913 回答
1

您可以使用全局变量:

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

p test #=> 6
p test #=> 7
于 2013-03-18T00:01:55.853 回答
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
于 2019-11-05T13:32:10.123 回答
0

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

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

puts f.resume # => 6
puts f.resume # => 7
...
于 2013-03-18T01:29:53.533 回答