8. メソッドとクラス
8.1.メソッド
C言語などの「関数」にあたるものをRubyでは「メソッド」と呼びます。
あるプログラムの手続きをまとめたものと考えます。
fig10-1.rb メソッド基本
!
def testfunc # 引数のない場合は括弧の省略可 "Hello"end # 最後の評価された式の値が返る(この場合"Hello")
!
def testfunc2( num = 100, memo = nil ) # 引数あり、デフォルト引数指定可 if num > 100return "result" => "high", :memo => memo # 複数の返り値 else
return "result" => "low", :memo => memo end
end
!
puts testfunc # => “Hello”
puts testfunc2(90,"abcd") # => {“result”=>”low”, :memo => “abcd”}
puts testfunc2(150) # => {“result”=>”high”, :memo => nil}
! !
38 Ruby基礎演習
社会人技術者研修 2015年度テキスト
!
メソッド名は小文字から始まる英数字
引数は省略、仮引数、デフォルト引数の指定可能
(他にも可変個数引数などの記述が可能)
!
メソッドの帰り値は、メソッド呼び出しから戻る直前の評価式の値、または return に渡された値 複数の帰り値を返す記述も可能
!
39 Ruby基礎演習
社会人技術者研修 2015年度テキスト
39
演習 !
Q7. 指定ファイルの総文字数をカウントして出力
! !!
Q8. 指定ファイル内容を大文字に変換して出力�
! !!
Q9. 指定ファイルから任意の文字のある行だけを表示する(行番号付き)�
!
40 Ruby基礎演習
社会人技術者研修 2015年度テキスト
8.2.クラス
オブジェクトに関する 定義と手続き をまとめたものを「クラス」と呼びます。
fig13-1.rb クラス基本
class Fruit #クラス名は大文字から DEFAULT_BRAND = “tsugaru” #定数定義
!
def initialize(str = “apple")# initializeは、このクラスのインスタンスが生成された直後に呼び出される @str_name = str
@str_brand = "unknown"
end
def name # クラスメソッド定義(C++で言うところのメンバ関数)
@str_name end
def brand # @str_brand
end
!
def set_name(str, brand) @str_name = str@str_brand = brand end
end # Fruitクラス定義ここまで
!
41 Ruby基礎演習
社会人技術者研修 2015年度テキスト
40
演習 !
Q7. 指定ファイルの総文字数をカウントして出力
! !!
Q8. 指定ファイル内容を大文字に変換して出力�
! !!
Q9. 指定ファイルから任意の文字のある行だけを表示する(行番号付き)�
!
40 Ruby基礎演習
社会人技術者研修 2015年度テキスト
8.2.クラス
オブジェクトに関する 定義と手続き をまとめたものを「クラス」と呼びます。
fig13-1.rb クラス基本
class Fruit #クラス名は大文字から DEFAULT_BRAND = “tsugaru” #定数定義
!
def initialize(str = “apple")# initializeは、このクラスのインスタンスが生成された直後に呼び出される @str_name = str
@str_brand = "unknown"
end
def name # クラスメソッド定義(C++で言うところのメンバ関数)
@str_name end
def brand # @str_brand
end
!
def set_name(str, brand) @str_name = str@str_brand = brand end
end # Fruitクラス定義ここまで
!
41 Ruby基礎演習
社会人技術者研修 2015年度テキスト
41
!
p "brand name : #{Fruit::DEFAULT_BRAND}” # => "tsugaru"
a = Fruit.new # aはFruitクラスのインスタンス
p a.brand # => “unknown”
a.set_name("apple", "fuji")
p a.brand # => “fuji”
!!
42 Ruby基礎演習
社会人技術者研修 2015年度テキスト
8.3.クラス継承
fig13-3.rb クラス継承
!
class Area # 面積を扱うクラス def initialize(x=0, y=0)@x = x; @y = y # @つきの変数はクラス変数 end
def calc_gross
@x * @y end
end
!
class Area_3D < Area # 面積クラスの要素を継承して体積クラスを定義 def initialize(x=1, y=1, z=1)
super(x,y) # superは継承元の同じメソッドを呼び出す
@z = z end
def calc_gross super * @z end
end
!
a = Area_3D.new( 10, 20, 30 ) p a.calc_gross
!
43 Ruby基礎演習
社会人技術者研修 2015年度テキスト
42
!
p "brand name : #{Fruit::DEFAULT_BRAND}” # => "tsugaru"
a = Fruit.new # aはFruitクラスのインスタンス
p a.brand # => “unknown”
a.set_name("apple", "fuji")
p a.brand # => “fuji”
!!
42 Ruby基礎演習
社会人技術者研修 2015年度テキスト
8.3.クラス継承
fig13-3.rb クラス継承
!
class Area # 面積を扱うクラス def initialize(x=0, y=0)@x = x; @y = y # @つきの変数はクラス変数 end
def calc_gross
@x * @y end
end
!
class Area_3D < Area # 面積クラスの要素を継承して体積クラスを定義 def initialize(x=1, y=1, z=1)
super(x,y) # superは継承元の同じメソッドを呼び出す
@z = z end
def calc_gross super * @z end
end
!
a = Area_3D.new( 10, 20, 30 ) p a.calc_gross
!
43 Ruby基礎演習
社会人技術者研修 2015年度テキスト
43