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とsetterを自動生成する。
- リファレンス Class: Module (Ruby 1.9.3) を参照すること。
- 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"