27

Ruby には 5 つの変数スコープがあります。

  1. ローカル変数: これらは通常の変数、 examplex = 25y = gaurishxyはローカル変数です。
  2. インスタンス変数: これらは@、実際の変数名の前に記号で示されます。クラスの各インスタンス/オブジェクトが異なる/個別の値を持つように、主にクラスで使用されます。例。@employee.name = 'Alex'
  3. クラス変数:@@変数名の前に記号を付けて示します。クラス変数、すべてのインスタンス/オブジェクトに同じ値があると思います。
  4. グローバル変数$:シンボルで始まり、どこからでもアクセスできます。例$LOAD_PATH
  5. 定数: 大文字で始める必要がありますが、慣例によりALL_CAPS. ただし、これは定数ですが、その値は定数ではなく、変更できます (ただし、ruby は警告をスローします)。つまり、これも変数のように機能します。

お気づきかもしれませんが、上記はすべて、何らかの型の値を格納する変数であり、その値を変更できます。ただし、各スコープは少し異なることを行います。5 つの異なるタイプの変数スコープを持つことは、私を混乱させます。主に、どのような場合にコードで特定のスコープを使用する必要があるかを判断するのが困難です。だから私は私の心にいくつかの質問があります。お答えください:

  1. インスタンス変数とは異なり、ローカル変数とクラス変数はすべてのオブジェクト/インスタンスで同じままであることに気付きました。では、ローカル変数とクラス変数の違いは何ですか?
  2. クラス変数の代わりにローカル変数を使用できますか? またはその逆。はいの場合はその理由を、いいえの場合はその理由を教えてください。
  3. global $xruby のグローバル変数は、PHPの邪悪な変数を思い起こさせます。ruby のグローバル変数も悪と見なされるため、使用しないでください。または、ルビーでグローバル変数を使用することが理にかなっている特定のケースがありますか?
  4. 定数が定数ではなく、値を変更できるのはなぜですか? 定義による定数の値は定数である必要がありますか? それ以外の場合は、別の変数を使用して、その値を変更しないでください。それはRubyの CONSTANT と同等でしょうか?
  5. ruby の 5 つの異なる変数スコープの違いを説明するページ/リソース/リンクはありますか? 参考までに、手元に置いておきたいと思います。
  6. どのようなユースケースで、コード内で特定の変数スコープを使用する必要がありますか? したがって、5つのケースすべてをcanの例で説明すると、クールになるでしょう。これが私の混乱の主な理由です。
  7. publicJavaのような事実上の選択はありますか? ほとんどのユースケースで安全な方法はどれですか?

時間を割いて質問を読んで回答していただきありがとうございます

4

4 に答える 4

14
  1. クラス変数はクラス変数であり、クラスに関連付けられているため、すべてのインスタンスで同じです。各インスタンスを含め、すべてが同じ変数にアクセスします。

  2. いいえ。ローカル変数はまさにそのローカルです。それらは、関数に対してローカルである場合もあれば、クラス変数であるのとは異なるクラス宣言に対してローカルである場合もあります。クラス宣言のローカルは、クラス宣言が終了するとスコープ外になります。

  3. それは、それらがまったく同じであり、グローバルであるためです。グローバルな状態は常に悪です。これは言語や環境の特性ではありません。とは言うもののグローバルな状態が必要になる場合があります。それがまさにその通りです。グローバル状態がある場合は、グローバル状態を使用するのが理にかなっています。秘訣は、グローバル状態を適切に使用することです。これは、重要な試みである場合があります。

  4. それがRubyです。

  5. 1つはすでにクリスによって与えられています。

  6. この質問は主に自己回答になると思います。全世界がアクセスを必要とするときにグローバル。クラスインスタンスに固有のインスタンス。ローカルスコープでのみ必要な場合はローカル(たとえば、メソッド、ブロック(ブロックスコープに関しては1.8と1.9の違いに注意)など)変数が変更されない場合は定数。すべてのインスタンスが必要とするものである場合、またはクラスメソッドを介して公開される場合は、クラスに密接に関連付けられているものである場合のクラス変数。

  7. 「ほとんどのユースケース」はありません。それは、変数で何をしているかに完全に依存します。そしてpublic、Javaの事実上の選択ではありません-それは問題のエンティティに依存します。デフォルトのJavaスコープはpackage-private(メソッド、プロパティ)です。Rubyでどちらを使用するかは完全にユースケースに依存し、Javaの場合と同様に、Rubyではさらに簡単に回避できることに注意してください。

于 2012-07-15T21:52:27.720 に答える
7

ローカル変数はクラスのものと同等ではなく、現在のブロックに関連付けられています。ブロックで宣言された任意のローカル変数をそこで使用できます。クラス変数は、現在のクラス構造に関連付けられています。クラスを定義すること自体がブロックであるため、同様にローカル変数にアクセスできる場合がありますが、別のコンテキストでクラスを参照すると、参照できないことがわかります。同じ方法でローカル変数。

グローバル変数は、悪用された場合、悪い形式と見なされます。OOP は、プログラム全体の定数が不要になるようにプログラムを構築するのに役立ちます。それらは実際にはグローバルなものであると考えてください。PIの値や妻を愛しているかどうかなど、世界全体に対する一貫性を保証できない場合は、おそらく約束をするべきではありません.

コツをつかめば、「Ruby Variable Scope」が参考になると思います。

于 2012-07-15T20:27:20.390 に答える
2

次のリンクで、Ruby でのさまざまなスコープとその可視性に関する適切で詳細な説明を見つけました。詳細な例を含むスコープと可視性。

それによると、

Class variable (@@a_variable): Available from the class definition and any sub-classes. Not available from anywhere outside.

Instance variable (@a_variable): Available only within a specific object, across all methods in a class instance. Not available directly from class definitions.

Global variable ($a_variable): Available everywhere within your Ruby script.

Local variable (a_variable): It is available only in the particular method or block in ruby script. 

インスタンス変数に関するその他の説明は次のとおりです。その特定のクラスの任意のメソッドでインスタンス変数にアクセスできます。ローカル変数はメソッドの外ではアクセスできません。以下は、この概念を徹底的に説明する ruby​​ monk の例です。

class Item

   def initialize(item_name, quantity)

       @item_name = item_name   
       @quantity = quantity

   end

  def show

   puts @item_name
   puts @quantity
   supplier = "Acme corp"
   puts supplier

  end
end

 Item.new("tv",1).show

ここで、supplier は、この例でのみ show メソッドからアクセスできるローカル変数です。supplier 変数を initialize メソッドで宣言し、show メソッドで出力してみてください。未定義の変数サプライヤーとしてエラーが発生します。

役立つことを願っています。:)

于 2015-09-24T06:36:50.630 に答える
1

これは私の 2 セントであり、c++/java/c# プログラマー向けに書いています。

Ruby の local/$Global 変数は、c++/java/c# の local/Global 変数に少し似ています。

Ruby @instance 変数は、c++/java/c# のメンバー変数 /class プロパティのようなもので、任意のメンバー関数/クラス メソッドでアクセスできます。ただし、Ruby インスタンスはクラスだけでなく、Ruby モジュールにも適用できます。

Ruby @@class 変数は、同じクラスのすべてのインスタンス間で共有される c++/java の静的メンバー変数のようなものです。

于 2016-04-04T17:12:56.617 に答える