Rubyの基礎紹介(二)

12325 ワード

前言
前回はRubyについて簡単に紹介しましたが、この節では正式にRubyの世界に足を踏み入れ、真相を探り始めました.
Rubyの特徴
(1)オブジェクト向けサポート.
(2)動的言語:定義済みのクラスを変更したり、既存のクラスにインスタンスメソッドを追加したりすることができます.
(3)移植性が良い:UNIXオペレーティングシステムだけでなくWindowsなどのオペレーティングシステムでも実行できる.
(4)弱い言語:変数は宣言する必要はなく、変数にはタイプがなく、変数は任意のタイプのデータを保存することができる.
(5)自動ごみ回収メカニズムをサポートする:私たちが手動でごみ回収を行うことを避ける.
(6)強力な異常処理メカニズム:Rubyプログラムの頑丈性を保証する.
(7)簡潔な構文:正規表現のサポートを提供し、演算子の再ロードをサポートします.
(8)明確な命名規則.
(9)動的読み込み:実行時は、実行するオペレーティングシステムによって異なります.
(10)完全無料.
Rubyプログラムコメント
注記には、次の2つの形式があります.
(1)1行コメント.
(2)複数行コメント.
Rubyは、コメントの開始を井戸番号(#)で表し、この行が終わるまで番号の後に続くコードは解釈器に無視されます.次のようになります.
#      
def method
  puts "Hello World"
end

以上は単行コメントです.もちろん、コードドキュメントにコメントを追加する必要がある場合があります.この場合、ドキュメントコードコメントは、rdocコマンドでコメントを抽出する必要があります.
Rubyコマンドルール
(1)「$」で始まる変数をグローバル変数とする.
(2)「@」で始まる変数をインスタンス変数とする.
(3)「@@」で始まる変数をクラス変数とする.
(4)小文字または下線()先頭の変数はローカル変数です.
(5)大文字で始まる変数を定数とする.
定数
Rubyは定数の頭文字の大文字のみを要求するが,可読性を高めるためにRubyの定数のすべてを大文字にすることを一般的に提案する.
class Constant
  #       
  Foo = 5
  #     
  Foo = 6
  puts Foo
end

一般的に他のプログラミング言語では定数を再割り当てしてもエラーは発生しませんが、Rubyではエラーは発生しませんが、warning:already initialized constant Constant::Fooという警告メッセージが表示されます
(1)定数の再割り当てはできません
では問題が来て、定数はどこで定義できますか?見てみましょう
def info
  FOO = 4
  puts FOO
end

エラーが発生します:dynamic constant assignment(SyntaxError)
(2)定数はクラス,モジュールでのみ定義でき,メソッドでは決して定義できない.
Ruby変数とその役割ドメイン
ローカル変数
ローカル変数は、クラス内、モジュール内、またはメソッド内に定義できます.小文字で始まる変数で値を割り当てると、ローカル変数が表示されます.変更量の役割ドメインは、クラス、モジュール、またはメソッドにのみ属し、クラス、モジュール、またはメソッドから離れると、このローカル変数は自然に消えます.
#      
class Apple
  #         
  local = "        "
  puts local
end

#       
def info
  #           
  local = "         "
  puts local
end

#     
info

#       
module Vegetable
  #           
  local = "          "
  puts local

上記では、クラス、メソッド、モジュールにそれぞれ3つのローカル変数の同じ名前を定義していますが、3つのローカル変数は互いに干渉せず、対応するクラス、メソッド、モジュール内部でのみ有効です.
【注意】上記のクラス、メソッド、およびモジュールの内部にない最上位変数を定義できます.この最上位変数は、最上位オブジェクトでもC#のObjectオブジェクトと同様であり、この変数の役割ドメイン範囲はアプリケーション全体です.
(1)ローカル変数は内部クラスとサブクラスではアクセスできない.次のようになります.
class Fruit
  local = "Hello"
  class Apple
    puts local
  end
end

エラー:undefined local variable or method`local'for Fruit::Apple:Class(Name Error)
では、最上位オブジェクトに最上位変数を定義すると、クラスにアクセスできますか?次のようになります.
local = "Hello"
class Apple
    puts local
end

この場合もエラーが発生します.この最上位変数は最上位オブジェクトにあり、このAppleは最上位オブジェクトのサブクラスであるため、上記のエラーが発生したら説明します.
では、ローカル変数を宣言した後、いつから有効になるのでしょうか.テストを見てみましょう
class Apple
    puts local
    local = "Hello World"
end

このときのエラーは、undefined local variable or method`local'for Apple:Class(NameError)
クラス、モジュール、メソッドでローカル変数を宣言すると、クラス、モジュール、メソッドの定義が終了するにつれてローカル変数が有効になりますが、定義後にローカル変数を使用する必要があります.
(2)ローカル変数は、先に定義してから使用する必要があります.
グローバル変数
グローバル変数はどこでもアクセスできるので、通常は、グローバル変数が各モジュール間の結合を引き起こすため、グローバル変数の使用をできるだけ避ける必要があります.次のように
$global = "Hello World"
class Apple
    puts $global
end

def info
  puts $global
end

クラスにもメソッドにもアクセスできる最上位レベルのグローバル変数を定義しました.
(1)グローバル変数はクラスにもメソッドにもアクセスできる.
では、グローバル変数はローカル変数と同じように定義してから使用する必要がありますか?見てみましょう
class Apple
    puts $global
end

何を実行しても間違いはありません.何が起こっているのか、コードを次のように変更します.
class Apple
    puts $global.nil?
end

最後にtrueとして印刷されたので、結論を出しました.
(2)グローバル変数は変数宣言を必要とせず、まだ初期化されていないグローバル変数を参照する場合、その値はnilである.
インスタンス変数
静的言語とは異なり、Ruby言語は動的言語です.Rubyのインスタンス変数は宣言する必要がないため、各インスタンス変数は最初の出現時に動的にオブジェクトに追加されます.したがって、Rubyのインスタンス変数は、通常、メソッドにクラス宣言を定義します.すなわち、インスタンス変数はメソッドが存在するクラスに属するインスタンスであり、メソッドではありません.コードという言葉がどういう意味なのか見てみましょう.
class Apple
  #        
  def info1
    #       @
    puts @a
  end
  #        
  def info2
    #        
    @a = "Hello World"
  end
end

#   Apple    
apple = Apple.new

#     
apple.info2
apple.info1

info 1メソッドを呼び出すときにインスタンス変数@aが定義されていない場合でも、メソッドは実際の呼び出し時にのみ有効であるため、info 2メソッドを呼び出すと、Appleクラスに@aのインスタンス変数が動的に追加されます. 
説明:C#とJavaでは、オブジェクトを作成すると、オブジェクトのすべてのインスタンス変数にメモリ領域が一度に割り当てられますが、Rubyはそうではありません.そのダイナミック性のため、オブジェクトを作成するときにインスタンス変数がなく、インスタンス変数の定義が実行されるまで、オブジェクトはインスタンス変数を動的に追加します.また、グローバル変数と同様に、インスタンス変数は宣言を表示する必要がなく、定義されていないインスタンス変数を使用すると、そのインスタンス変数の値はnilになります.しかし、インスタンス変数とローカル変数の違いは、そのライフサイクルにあり、インスタンス変数のライフサイクルはそのオブジェクトのライフサイクルと同じであり、クラスのオブジェクトが存在する限り、そのオブジェクトのインスタンス変数はずっと存在する.局所変数は、閉パケットを使用しない限り、方法の消滅に伴って消滅する.
クラス変数
クラス変数は、クラスで定義したり、モジュールで定義したり、メソッドで定義したりすることができます.クラス変数コードを定義するには、次のようにします.
class Apple
  #           
  @@color = "  "
  #        
  puts @@color
  def info
    #          
    puts "       "+@@color
  end
end

Apple.new.info

クラス変数とインスタンス変数が異なるのは、クラス変数を使用する前に定義する必要があります.未定義のクラス変数を参照すると、uninitialzed class varialbeが発生します.
また、次のようにクラス変数をメソッドで定義することもできます.
class Apple
  def color= (att)
    #      
    @@color = att
  end
  def color
    #      
    @@color
  end
  #    @@color     
  puts defined? @@color
end

#    Apple  
a1 = Apple.new
a2 = Apple.new

#     Apple    @@color    
a1.color = "  "
a2.color = "  "
#  a1      @@color  
puts a1.color

上記の印刷は緑色である、a 1を呼び出す.color,このとき@@colorは定義されていません.このとき@@colorはnilであり、そのクラス変数をインスタンスオブジェクトに追加します.
では、a 1が呼び出されると、問題が発生します.color=「赤」の場合、これまでa 2.color=「緑」なのに、どうして「緑」になったのでしょうか.
クラス変数の1つの特性に関連します.1つのクラス、そのサブクラス、およびそれらのインスタンスの同名クラス変数は、同じ高速メモリ領域であるクラス、そのサブクラス、およびそれらのインスタンスの同名クラス変数を共有し、同じクラス変数を参照します.
締めくくり
クラス変数と定数の違い
(1)クラス変数は繰り返し付与できます(ただし、定数付与には警告が表示されます).
(2)クラス変数のデフォルトはprotectedであり、クラス外部で直接参照することはできません(継承で参照または付与できます).
クラス変数とインスタンス変数の違い
(1)クラス範囲内で定義されたクラス変数は,そのクラスのメソッドにアクセスできるが,インスタンス変数はできない.
(2)クラス変数はサブクラスで参照または付与することができるが、インスタンス変数値はクラス範囲内で直接参照または付与することができる.