4

Ruby の変数とシンボルの構文を理解するのに苦労しています。Rails 4 を使用したアジャイル Web 開発という本を読んでいます。Web サイトを構築できるように、Ruby と Rails の両方を学ぼうとしています。

私が読んでいる本やチュートリアルには、変数の前に「@」記号が付いている場合と、前に @ 記号が付いていない場合があります。それらの違いは何ですか?

また、コロンと混同しています。コロンが先頭にある変数 (:order など) と、コロンが末尾にある変数 (コロン: など) を時々見かけます。コロンが何をしているのかわかりません。

Rubyの構文を理解するのを手伝ってください。

4

4 に答える 4

10

で始まる@変数はインスタンス変数、他の言語では「プロパティ」です。「クラシック」変数はメソッド/ブロックのスコープに対してローカルですが、インスタンス変数は特定instanceのオブジェクトに対してローカルです。次に例を示します。

class Foo

  def initialize(bar)
    @bar = bar
  end

  def bar
    @bar # the variable is specific to this instance
  end

  def buzz
    buzz = 'buzz' # this variable is not accessible outside of this method
  end

end

で始まる変数も表示@@される場合があります。これらはクラス変数であり、クラスのすべてのインスタンスからアクセスでき、サブクラスのすべてのインスタンスと共有されます。これらの変数の使用は、主にサブクラスが変数を共有し、多くの混乱を引き起こす可能性があるため、通常は推奨されません。

Ruby ではすべてがオブジェクトであり、クラスはオブジェクト ( class のインスタンスClass) であるため、クラス インスタンス変数を使用することもできます。

class Foo

  def self.bar
    @bar #we are in class Foo's scope, which is an instance of class Class
  end

  def self.bar=(bar)
    @bar = bar
  end

  def bar
    @bar # Foo.new.bar != Foo.bar 
  end

end

「コロン付きの変数」と呼ばれるものは変数ではありませんそれらはシンボルと呼ばれる特定のタイプの文字列であり、不変であり、インタープリターによる迅速な識別のために最適化されています。実際、これらはポインターとして内部的に保存されるため:this == :this、非常に迅速な操作です。

このプロパティは、迅速な検索やメソッドに渡す「フラグ」を提供するため、ハッシュ キーの適切な候補になります。それらは、それらが言うことを「表す」一種の緩やかな定数と考えてください。それらの不変性も危険です。これまでに作成されたすべてのシンボルはガベージ コレクションされません。何千ものシンボルを作成することで簡単にメモリ リークが発生するため、それらを賢く使用してください。

Ruby 2.2 シンボル、特定の場合 (参照が保持されず、比較が不要な場合) にガベージ コレクションされる可能性があるため、更新します。

于 2013-11-04T15:38:12.430 に答える
3

@記号の付いた変数はインスタンス変数です。これが意味することは、それらが宣言されているクラスのインスタンスが持続する限り持続するということです。したがって、 というクラスがMessageあり、各メッセージに という変数がある@subject場合、新しいメッセージをインスタンス化すると、メッセージ オブジェクト自体が存続している限り、そのサブジェクト変数がメモリ内に保持されます。シンボルがない場合、@宣言された関数が「スコープ外」または終了すると、関数が完了し、Ruby VM によってメモリが再利用されるため、変数は「失われ」ます。@2 つの記号で始まる「クラス変数」もあります。これは、変数がクラスのすべてのインスタンスで共有されることを意味します。

コロンに関しては、変数の前にある場合、それは「シンボル」であることを意味します。これは通常、Ruby でハッシュやその他のデータのビットの識別子として使用されます。単語の末尾にある場合は、Ruby 1.9+ 構文のハッシュ識別子のキー部分であることを意味します。

于 2013-11-04T15:41:54.870 に答える
2

インスタンス変数: ( @foo = '123') インスタンス変数が定義され、リクエストの現在のインスタンス全体でその値が保持されます。Rails mvc パラダイムでは、インスタンス変数の最も一般的な使用法は、コントローラーからビューへのデータ通信を支援するために使用され、コントローラーの一部で物事を定義し、別の部分で使用できるようにします。

class ProjectsController < ApplicationController
  before_filter :find_project

  def show; end

  def update
    if @project.update_attributes(params[:project])
      ...
    end
  end

  private
  def find_project
    @project = Project.find(params[:id])
  end
end

上記のコードでは、すべてのメソッドの前に実行される before フィルターがあることがわかります。上記の場合、現在のプロジェクトを見つけてインスタンス変数に保存します。また、インスタンス メソッドであるため、このクラス内のどこにでもアクセスできるだけでなく、html のレンダリングに使用されるビューにもアクセスできます。

ローカル変数: ( ) その名前が示すとおり、定義されてfoo = '123'いる現在のメソッド ( ) 内でのみアクセスできます。def

于 2013-11-04T15:33:17.333 に答える
2

変数の前に「@」記号が付いている場合と、前に @ 記号が付いていない場合があります。

"@"記号の付いた変数はインスタンス変数であり、前に が付いていない変数は、@定数、ローカル変数、またはグローバル変数にすることができます。Ruby プログラミング/構文/変数と定数を読んでください。

:order のように、コロンが先頭にある変数を時々見かけます。

それらはシンボルと呼ばれます。

そして、colon: のようにコロンが末尾にある変数が表示されます。コロンが何をしているのかわかりません。

これらはおそらく、キーがシンボルであるハッシュ構文(ヒントを教えてくれるので推測します)です。例: {foo: 1}- これはハッシュです。

また、あなたが要求したように読んでください:

于 2013-11-04T15:20:54.273 に答える