English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية
変数は、どんなプログラムでも使用できるデータを保持するための場所です。
Rubyは5種類の変数をサポートしています。
通常は小文字またはアンダースコアで始まる:変数(Variable)。
$で始まる:グローバル変数(Global variable)。
@で始まる:例の変数(Instance variable)。
@@で始まる:クラス変数(Class variable)クラス変数は全体の継承階層で共有されます
大文字で始まる:定数(Constant)。
前の章ではこれらの変数について概要を学びました。本章では、これらの5種類の変数について詳細に説明します。
グローバル変数は$で始まります。初期化されていないグローバル変数の値は nil、使用 -wオプションの後、警告が発生します。
グローバル変数に値を代入すると、グローバル状態が変更されるため、グローバル変数の使用は推奨されません。
以下の例では、グローバル変数の使用法を示します。
#!/usr/bin/ruby # -*- coding: UTF-8 -*- $global_variable = 10 class Class1 def print_global puts "グローバル変数はClass1 中で出力されるのは#$global_variable"です end end class Class2 def print_global puts "グローバル変数はClass2 中で出力されるのは#$global_variable"です end end class1obj = Class1.new class1obj.print_global class2obj = Class2.new class2obj.print_global
ここでは、$global_variableがグローバル変数です。以下の結果が得られます:
注意:Rubyでは、変数や定数の前に#文字を置いて、どんな変数や定数の値もアクセスできます。
グローバル変数はClass1 中で出力されます 10 グローバル変数はClass2 中で出力されます 10
例の変数は@で始まります。初期化されていない例の変数の値は nil、使用 -wオプションの後、警告が発生します。
以下の例では、例の変数の使用法を示します。
#!/usr/bin/ruby class Customer def initialize(id, name, addr) @cust_id=id @cust_name=name @cust_addr=addr end def display_details() puts "顧客のID @cust_id" puts "顧客の名前 @cust_name" puts "顧客の住所 @cust_addr" end end # オブジェクトの作成 cust1=Customer.new("1"", "John", "Wisdom Apartments, Ludhiya") cust2=Customer.new("2"", "Poul", "New Empire road, Khandala") # メソッド呼び出し cust1.display_details() cust2.display_details()
ここでは、@cust_id、@cust_name、@cust_addrが例の変数です。以下の結果が得られます:
Customer id 1 Customer name John Customer address Wisdom Apartments, Ludhiya Customer id 2 Customer name Poul Customer address New Empire road, Khandala
クラス変数は@@で始まり、メソッド定義で使用する前に初期化する必要があります。
未初期化されたクラス変数の参照はエラーが発生します。クラス変数はその定義されたクラスやモジュールのサブクラスやサブモジュールで共有して使用できます。
使用中 -wオプションの後にクラス変数のオーバーライドにより警告が発生します。
以下の例ではクラス変数の使用法を示しています。
#!/usr/bin/ruby class Customer @@no_of_customers=0 def initialize(id, name, addr) @cust_id=id @cust_name=name @cust_addr=addr end def display_details() puts "顧客のID @cust_id" puts "顧客の名前 @cust_name" puts "顧客の住所 @cust_addr" end def total_no_of_customers() @@no_of_customers += 1 puts "顧客の総数: #@@no_of_customers" end end # オブジェクトの作成 cust1=Customer.new("1"", "John", "Wisdom Apartments, Ludhiya") cust2=Customer.new("2"", "Poul", "New Empire road, Khandala") # メソッド呼び出し cust1.total_no_of_customers() cust2.total_no_of_customers()
ここでは、@@no_of_customersはクラス変数です。これにより以下の結果が得られます:
顧客の総数: 1 顧客の総数: 2
ローカル変数は小文字またはアンダースコア_で始まります。ローカル変数のスコープはclass、module、def、doから対応する終わりまでまたは左大括号{から右大括号}までです。
未初期化のローカル変数を呼び出すと、引数のないメソッドの呼び出しと解釈されます。
未初期化のローカル変数に値を代入することも変数の宣言とみなされます。変数は現在のスコープが終わるまで存在します。ローカル変数のライフサイクルはRubyのプログラム解析時に決定されます。
上記の例では、ローカル変数はid、name、addrです。
定数は大文字で始まります。クラスやモジュール内で定義された定数はクラスやモジュールの内部からアクセスできます、クラスやモジュールの外部で定義された定数はグローバルにアクセスできます。
定数はメソッド内で定義できません。未初期化の定数を参照するとエラーが発生します。初期化された定数に値を代入すると警告が発生します。
#!/usr/bin/ruby # -*- coding: UTF-8 -*- class Example VAR1 = 100 VAR2 = 200 def show puts "一つ目の定数の値は #{VAR1" puts "二つ目の定数の値は #{VAR2" end end # オブジェクトの作成 object=Example.new() object.show
ここでは、VAR1 と VAR2 これは定数です。以下の結果が得られます:
一つ目の定数の値は 100 二つ目の定数の値は 200
それらは特別な変数で、ローカル変数の外観を持っていますが、常量のような動作をします。これらの変数に値を割り当てることができません。
self: 現在のメソッドのリシーバーオブジェクトです。
true: true を表す値です。
false: false を表す値です。
nil: undefined を表す値です。
__FILE__: 現在のソースファイルの名前です。
__LINE__: 現在の行がソースファイルの中での番号です。