ターミナルを交番に届けたら

多口カタン(katan_t)によるプログラミング系ブログです。

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がいつになるかは未定