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

nicoogaの答えに似ていますが、より自己完結型です。

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

メソッドで変数のスコープを設定し、ラムダを返します

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

test = counter
test[]
#=>1
test[]
#=>2
于 2013-03-18T00:08:24.267 に答える
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

ルビーでは、どのクラスもインスタンスが1つしかないオブジェクトです。したがって、クラスにインスタンス変数を作成でき、それは「静的」メソッドとして機能します;)

出力:

  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 に答える