Rubyの基本文法まとめ その2
今回はメソッド、クラス、モジュール、proc、例外についてです。
動作確認はRuby2.0.0でしています。
その1はこちら http://terminal.hatenablog.com/entry/2014/04/28/213824
メソッド
defの後ろにメソッド名を書きます。 命名規約は英小文字、_繋ぎで、変数と同じです。
def puts_precure puts 'precure' end puts_precure #=> precure
もちろん引数も渡せます。
def print_precure_times(num) if num.kind_of?(Integer) # 型チェック(is_a?でも可) num.times do print 'precure ' end end end print_precure_times(3) #=> precure precure precure
引数にはデフォルト値の設定も可能です。
def print_times(str = 'precure' , num = 1) if str.kind_of?(String) && num.kind_of?(Integer) num.times do print "#{str} " end end end print_times() #=> precure print_times('Fresh') #=> Fresh print_times('Fresh' , 3) #=> Fresh Fresh Fresh
また、returnを書かない場合、最後の一文がreturnとして扱われます。
def precure 'You are Precure' end puts precure #=> You are Precure
クラス
命名規約は各単語の先頭を大文字にして繋げることです。
class PrecureClass end precure = PrecureClass.new puts precure.class #=> PrecureClass
インスタンスメソッド
class PrecureClass def first 'Futari wa Pretty Cure' end end precure = PrecureClass.new puts precure.first #=> Futari wa Pretty Cure
インスタンス変数
頭に@をつけるとインスタンス変数となります。
class PrecureClass def set_name(str) @name = str end def puts_name puts @name end end precure = PrecureClass.new precure.set_name('Black') precure.puts_name #=> Black
インスタンス変数にクラス外からもアクセスする場合は、以下のように書きます。
class PrecureClass attr_accessor :index, :name def initialize(index, name) @index = index @name = name end end precure = PrecureClass.new(1 , 'Black') puts precure.index #=> 1 puts precure.name #=> Black precure.index = 2 precure.name = 'White' puts precure.index #=> 2 puts precure.name #=> White
initializeメソッドは初期化のためのものです。 必須ではありません。
クラスメソッド
self.をつけます。
class PrecureClass def self.first 'Futari wa Pretty Cure' end end puts PrecureClass.first #=> Futari wa Pretty Cure
クラス変数
@@をつけます。
class PrecureClass @@index = 0; def up_index @@index += 1 end def puts_index puts @@index end end precure1 = PrecureClass.new precure1.up_index precure1.puts_index #=> 1 precure2 = PrecureClass.new precure2.up_index precure2.puts_index #=> 2 precure1.puts_index #=> 2
継承
class PrecureClass def puts_first puts 'Futari wa Pretty Cure' end end class SecondPrecureClass < PrecureClass def puts_second puts 'Futari wa Pretty Cure Max Heart' end end precure = SecondPrecureClass.new precure.puts_first #=> Futari wa Pretty Cure precure.puts_second #=> Futari wa Pretty Cure Max Heart
モジュール
クラスによく似ていますが、インスタンスを生成できません。
module PrecureModule def self.puts_first puts 'Futari wa Pretty Cure' end end PrecureModule.puts_first #=> Futari wa Pretty Cure
モジュールの中にはクラスを入れられます。 ですので、名前空間のような使い方が可能となります。
module PrecureModule class PrecureClass def puts_first puts 'Futari wa Pretty Cure' end end end precure = PrecureModule::PrecureClass.new precure.puts_first #=> Futari wa Pretty Cure
モジュールの内容をクラスに含めたいときはincludeしましょう。
module PrecureModule def puts_first puts 'Futari wa Pretty Cure' end end class PrecureClass include PrecureModule end precure = PrecureClass.new precure.puts_first #=> Futari wa Pretty Cure
特異メソッド
特定のオブジェクトでのみ使えるメソッドのことです。
class PrecureClass end precure = PrecureClass.new def precure.puts_first puts 'Futari wa Pretty Cure' end precure.puts_first #=> Futari wa Pretty Cure
モジュールに定義しextendを使って取り込むこともできます。
module PrecureModule def puts_first puts 'Futari wa Pretty Cure' end end class PrecureClass end precure = PrecureClass.new precure.extend(PrecureModule) precure.puts_first #=> Futari wa Pretty Cure
クラスに追加すればクラスメソッドのように使えます。
module PrecureModule def puts_first puts 'Futari wa Pretty Cure' end end class PrecureClass extend PrecureModule end PrecureClass.puts_first #=> Futari wa Pretty Cure
proc
ブロックを保持するために使われます。
precure = Proc.new{ puts 'Precure' } precure.call #=> Precure
引数も渡せます。
precure = Proc.new{|str| puts "#{str} Precure" } precure.call('Fresh') #=> Fresh Precure
require
ファイルの読み込みにはrequireを使います。
class PrecureClass def self.puts_precure puts 'Precure' end end
たとえばprecure.rbとして上のコードを保存して
require './precure' PrecureClass.puts_precure #=> Precure
例外
beginとendの間にてrescueで捕捉します。
begin n = 3 + '4' rescue => e puts e.message #=> String can't be coerced into Fixnum end
クラスを指定してrescueすることも可能です。
begin n = 3 + '4' rescue TypeError => e puts e.message #=> String can't be coerced into Fixnum end
複数のrescueを書くこともできます。 下の例では0での序算により例外ZeroDivisionErrorが発生しますがTypeErrorではないため、後のrescueが捕捉します。
begin n = 1 / 0 rescue TypeError => e puts 'TypeError' rescue => e puts e.message #=> divided by 0 end
例外を捕捉しないときの処理を書くelse、例外の有無にかかわらず行われるensureもあります。
begin n = 3 + 4 rescue => e puts e.message else puts '例外は捕捉されなかったよ' #=> 例外は捕捉されなかったよ ensure puts 'ここも実行されるよ' #=> ここも実行されるよ end
最後に
その3がいつになるかは未定