独学Ruby -基礎③-

引き続き、Rubyの基礎その3。

tanoshiiruby.github.io

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.

以上、。