ponkiti's blog

主に自分用、イベント参加メモや備忘録として利用

Ruby入門メモ(4)

関数的メソッドを作る

例1

def SayHi
    p "hello"
end
SayHi() # ()をつければメソッドだと判断される

def SayHi(name) # メソッドにはオプション(この場合はname)を持たせることができる
    p "hello! " + name
end
SayHi(name = "ponkiti")

def SayHi(name, name2) # オプションは複数指定可
    p "hello! " + name + ", " + name2
end
SayHi(name = "pon", name2 = "kiti")

実行結果

"hello"
"hello! ponkiti"
"hello! pon, kiti"

例2

def SayHi(name = "ponkiti")
    p "hello! " + name
end
SayHi()

def SayHi(name = "ponkiti") # メソッドは返り値を持たせることができる
    s = "hello! " + name
    return s
end
myname = SayHi()
p myname

実行結果

"hello! ponkiti"
"hello! ponkiti"

クラスの作成

  • クラスとは「オブジェクトの設計図」のようなものらしい。
  • クラスでメソッドの定義をしている。
  • クラスから作られたオブジェクト=インスタンスである。
class User # クラスは大文字から始める

    def initialize(name) # インスタンスを作る時に必ず実行される初期化処理
        @name = name # @から始まる変数=インスタンス変数
    end

    def sayHi # インスタンスメソッド
        p "hello, my name is #{@name}"
    end

end

tom = User.new("Tom") # インスタンスを作る=newする
tom.sayHi()

bob = User.new("Bob")
bob.sayHi()

実行結果

"hello, my name is Tom"
"hello, my name is Bob"

クラスメソッド

クラスから直接呼べるメソッドを作成できる。

class User

    def initialize(name) 
        @name = name # @から始まるもの=インスタンス変数
    end

    def sayHi #インスタンスメソッド
        puts "hello, my name is #{@name}"
    end

    def User.sayHello # クラスメソッド
        puts "Hello from User class"
    end

end

User.sayHello() # newしてインスタンスを作らなくてもよい

実行結果

"hello! from User class"
class User

    @@count = 0 #クラス変数

    def initialize(name) 
        @name = name # @から始まるもの=インスタンス変数
        @@count += 1
    end

    def sayHi # インスタンスメソッド
        puts "hello! my name is #{@name}"
    end

    def User.sayHello # クラスメソッド
        puts "Hello! from User class (#{@@count} users)"
    end

end

User.sayHello() # インスタンス=0

tom = User.new("Tom")
bob = User.new("Bob")

User.sayHello() # インスタンス=2

実行結果

Hello! from User class (0 users)
Hello! from User class (2 users)

クラスの継承

class User
    def initialize(name)
        @name = name
    end

    def sayHi
        p "hello, my name is #{@name}"
    end
end

class SuperUser < User #UserクラスをSuperUserクラスに引き継ぐ
    def shout
        p "hello, from #{@name}!!!"
    end
end

tom = User.new("Tom")
bob = SuperUser.new("Bob")

tom.sayHi()
bob.sayHi()

bob.shout() # OK
# tom.shout() Userクラスにはshoutメソッドは存在しないため、エラーとなる

実行結果

"hello, my name is Tom"
"hello, my name is Bob"
"hello, from Bob!!!"

アクセサ

インスタンス変数にアクセスできると便利だが、通常はアクセスできない。

class User
    def initialize(name)
        @name = name
    end

    def sayHi
        puts "hello! my name is #{@name}"
    end
end

bob = User.new("Bob")
bob.sayHi()
p bob.name # エラー:クラスのインスタンス変数には外部からアクセスできない

インスタンス変数にアクセスするためには、そのためのメソッドを別途用意しなければならない。

class User
    def initialize(name)
        @name = name
    end

    # getter(インスタンス変数の値を取得する)
    # インスタンス変数にアクセスするには、インスタンス変数と同名のメソッドを作成し、returnしなければならない
    def name
        return @name # returnは省略できる
    end

    # setter(インスタンス変数に値を設定する)
    def setName(newName) # インスタンス変数に値を設定したい場合
        @name = newName
    end

    def sayHi
        puts "hello, my name is #{@name}"
    end
end

bob = User.new("Bob")
bob.sayHi()
p bob.name
bob.setName('Tom')
bob.sayHi()

実行結果

hello, my name is Bob
"Bob"
hello, my name is Tom

getterとsetterを合わせて、accessor(アクセサ)と呼ぶ。

  • accessor:attr_accessor :name
  • getter:attr_reader :name
  • setter:attr_writer :name
class User
    def initialize(name)
        @name = name
    end

    # getterとsetterを自動生成する
    attr_accessor :name # シンボルでインスタンス変数を指定する

    def sayHi
        puts "hello, my name is #{@name}"
    end
end

bob = User.new("Bob")
bob.sayHi()

p bob.name # getterはそのまま
# bob.setName('Tom')
bob.name = 'Tom' # setterは簡単になる

bob.sayHi()

実行結果

hello, my name is Bob
"Bob"
hello, my name is Tom

Timeクラス

リファレンスのTimeクラスを参照すること。

現在時刻

t = Time.now
p t

t = Time.now
p t.year
p t.month

t = Time.new(2013, 12, 25, 12, 32, 22)
p t
t += 10
p t

実行結果

2014-10-11 01:02:13 +0900
2014
10
2013-12-25 12:32:22 +0900
2013-12-25 12:32:32 +0900

strftime

指定した文字列の形式で、日時を変換するstrftimeメソッド

t = Time.new(2013, 12, 25, 12, 32, 22)
p t.strftime("Updated: %Y-%m-%d")

実行結果

"Updated: 2013-12-25"