独学Ruby -基礎③-
引き続き、Rubyの基礎その3。
Contents
- インスタンスメソッド
- クラスメソッド
- 関数的メソッド ... print文とか
# インスタンスメソッドの例 array = "10, 20, 30, 40" print array,"\n" array = "10, 20, 30, 40".split(",") print array,"\n" print array[0], "-",array[1] , "-",array[2] , "-",array[3], "\n" # クラスメソッドの例 # 新しい配列を作成 a = Array.new
メソッドの定義
メソッド名にはアルファベット、数字、アンダースコアを使うことができる。
数字で始めるのはNG。
@myNumber = 0 def GetMyNumber() return @myNumber end def SetMyNumber(number=100) @myNumber = number end
呼び出し元
require_relative "mymethod.rb" my_number = GetMyNumber() print my_number,"\n" SetMyNumber(10) my_number = GetMyNumber() print my_number,"\n" SetMyNumber() my_number = GetMyNumber() print my_number,"\n"
引数を省略したときにデフォルト値を設定することもできる。
複数の戻り値を返すことも可能
def GetValue() return 1, 2 end results = Array.new results = GetValue() print results
オブジェクトが属しているクラスを知る
.classメソッド
ary = Array.new p ary.class str = "String" p str.class
オブジェクトがクラスのインスタンスかどうかを知る
.instance_of_?(クラス名)
ary = Array.new p ary.instance_of?(Array) str = "String" p str.instance_of?(String)
クラスの定義
class文
クラスを作るときの注意点
クラス名は必ず大文字で始めること。
# 時計クラス(スーパークラス) class Clock # 定数 Version = "1.0" # クラス変数 @@name = "Clock" # インスタンス変数 @current_time = Time.new # 現在時刻で初期化 # クラスメソッド def Clock.getVersion() return Version end def Clock.getName() return @@name end # newメソッドコール時に実行される def initialize(cur_time=Time.new) print "Clock Class Version is ", Version,"\n" @current_time = cur_time end # インスタンスメソッド def setTime(time) @current_time = time end def getTime() return @current_time end # アクセスメソッド def current_time return @current_time end def current_time=(time) @current_time = time end end
initializeメソッドを定義すると、newメソッド時に実行される。
require_relative "clock" # クラスメソッド p Clock.getVersion() p Clock.getName() # 定数のGet p Clock::Version # インスタンス生成 clock = Clock.new() current_time = clock.getTime() p current_time # インスタンスメソッドでSet/Get clock.setTime(Time.local(2019,1,1,12,30,10,0)) current_time = clock.getTime() p current_time # アクセスメソッドでSet/Get clock.current_time = Time.new() p clock.current_time
クラスの拡張
たとえばStringクラスを定義し、メソッドを拡張してみる。
string.rb
class String def func() print "func method of String\n" end end
ext_string.rb
class String def extFunc() print "extFunc of String(Extention)\n" end end
str.rb(実行元)
require_relative "string" require_relative "ext_string" str = String.new str.func() # string.rbで定義 str.extFunc() # ext_string.rbで定義
メソッド呼び出しの制限
アクセス制限レベル | 説明 |
---|---|
public | メソッドをインスタンスメソッドとして使えるように公開する |
private | メソッドをクラス内部でだけ使えるようにする |
protected | メソッドをクラス内部で使えるようにする 同一クラス内ではインスタンスメソッドとしても使える |
# アクセス制限 class AccessTest def pubMethod print "called Public Method\n" end public :pubMethod def privateMethod print "called Private Method\n" end private :privateMethod def protectedMethod print "called Protected Method\n" end protected :protectedMethod end
require_relative "access_test" access_test_obj = AccessTest.new() # インスタンスメソッドとして直接呼べる access_test_obj.pubMethod() # インスタンスメソッドとして直接呼べない access_test_obj.privateMethod() # Error # インスタンスメソッドとして直接呼べない access_test_obj.protectedMethod() # Error
Protectedメソッドへのアクセス
# AccessTestクラスを継承する require_relative "access_test" class AccessSubTest < AccessTest def hoge privateMethod() end end
require_relative "access_sub_test" access_sub_test_obj = AccessSubTest.new() access_sub_test_obj.hoge()
アクセス制限の記述方法
上のようにpublic :メソッド名という形で書くこともできるが、
次のようにするとまとめて同じアクセス制限にできる。
# アクセス制限 class AccessTest public #これ以降のメソッドはPublic def pubMethod1 print "called Public Method\n" end def pubMethod2 print "called Public Method\n" end private #これ以降のメソッドはPrivate def privateMethod1 print "called Private Method\n" end def privateMethod2 print "called Private Method\n" end protected #これ以降のメソッドはProtected def protectedMethod1 print "called Protected Method\n" end def protectedMethod2 print "called Protected Method\n" end end
クラスの継承
class クラス名 < スーパークラス名 ... end
すでに上のprotectedメソッドのアクセス確認で書いたけど。
# スーパークラス class SuperClass def initialize() print "Create Super Class.\n" end def func1() print "func1 of SuperClass.\n" end def func2() print "func2 of SuperClass.\n" end end
# サブクラス require_relative "super_class" class SubClass < SuperClass def initialize() print "Create SubClass.\n" end def func2() print "func2 of SubClass.\n" end end
require_relative "sub_class" obj1 = SuperClass.new() obj2 = SubClass.new() obj1.func1() obj2.func1() obj1.func2() obj2.func2()
実行結果。
Create Super Class. Create SubClass. func1 of SuperClass. func1 of SuperClass. func2 of SuperClass. func2 of SubClass.
以上、。