気軽に楽しくプログラムと遊ぶ

自分が興味があってためになるかもって思う情報を提供しています。

Ruby Moduleクラスの各種メソッドを動作確認する

Moduleクラスとは

  • ある機能をひとまとまりにしたモジュールのためのクラス
  • クラスのクラスであるClassクラスはModuleクラスを継承しているため、全クラス内で有用なメソッドを利用可
  • モジュールはincludeメソッドを用いて、任意のクラスにインクルード可能

定数の一覧を取得

Class.constants
=> [:Object, :Module, :Class・・・]

定数が定義されているかを確認

> Object.const_defined?(:ENV)
=> true
> Object.const_defined?(:ENVAAA)
=> false

定数値を取得する

> Object.const_get(:RUBY_VERSION)
=> "2.0.0"

定数値を設定する

> Object.const_set(:MY_CONST, 'myconst')
=> "myconst"
> Object::MY_CONST
=> "myconst"

定数値を削除する

> class Myclass
> MYCONST = 1
> p remove_const(:MYCONST)
> p MYCONST
> end
1
NameError: uninitialized constant Myclass::MYCONST

祖先クラスを取得する

> Array.ancestors
=> [Array, Enumerable, Object, Kernel, BasicObject]

インスタンスに定義されているメソッド一覧を表示

ClassクラスのインスタンスオブジェクトであるArrayクラスのメソッドを参照している。

> Array.instance_methods
=> [:inspect, :to_s, :to_a, :to_ary, :frozen?, :==, :eql?, :hash, :[], : 以下省略

メソッドの可視性の変更

privateで定義した後にpublicで再定義することで外部で参照できるようになる。

> class MyClass
> private
> def foo
> puts 'FOO'
> end
> public :foo
> end
=> MyClass
> my_class = MyClass.new
=> #<MyClass:0x007fe4c9a4ee70>
> my_class.foo
FOO
=> nil

メソッドの別名定義

定義した時点のメソッドを別名(org_foo)で定義。
その後、変更されてもorg_fooの内容は元のまま。

> class MyClass
> def foo
> 'foo'
> end
> alias_method :org_foo, :foo
> def foo
> 'bar' + org_foo
> end
> end
=> nil
> m = MyClass.new
=> #<MyClass:0x007fe4c9a0c548>
> m.foo
=> "barfoo"

クラス内のコンテキストで評価する

Arrayクラス内でdo〜endが評価されたとして処理される

> Array.class_eval do
* def foo
> 'bar'
> end
> end
=> nil
> [].foo
=> "bar"

クラス内のコンテキストで評価する(引数を渡す場合)

MyClassクラス内でブロックが評価されたとして処理される
> class MyClass
> CONST = 1
> end
=> 1
> MyClass.class_exec(3) {|i| puts i + self::CONST}
4
=> nil

クラス変数の一覧

class_variables→クラスの変数たち。。
返却値がシンボルでクラス変数表記って。オブジェクトの無駄遣いをせずに
クラス変数名を表記するってことなのかな。

> class MyClass
> @@foo = 1
> end
=> 1
> MyClass.class_variables
=> [:@@foo]

クラス変数が定義されているかを確認

最初、variableにsをつけてしまった。。変数一覧じゃないものね。

> MyClass.class_variable_defined?(:@@foo)
=> true

クラス変数の取得、設定、削除

MyClassへ特異メソッドを定義することで簡単に呼べるように定義しつつ、実行

#クラス変数へ値を設定
> class MyClass
> @@var = 'foobar'
> end
=> "foobar"

#取得メソッドを定義
> def MyClass.get
> class_variable_get(:@@var)
> end
=> nil

#設定メソッドを定義
> def MyClass.set=(var)
> class_variable_set(:@@var, var)
> end
=> nil

#削除メソッドを定義
> def MyClass.clear
> remove_class_variable(:@@var)
> end
=> nil

#これより定義したメソッドを使ってみる

# クラス変数を取得
> MyClass.get
=> "foobar"

# クラス変数を削除
> MyClass.clear
=> "foobar"
> MyClass.class_variable_defined?(:@@var)
=> false

# クラス変数を設定
> MyClass.set = 'newvar'
=> "newvar"
> MyClass.get
=> "newvar"

モジュール機能を取り込む

オブジェクトにモジュール機能を追加するにはincludeやextendを用いる

  • include (クラスとインスタンスに機能を追加)
  • extend (オブジェクトのみに機能を追加。クラスメソッド追加時によく使う)

included,extendedメソッドはそれぞれ、includeメソッド、extendメソッド
呼ばれた際に実行されるメソッド。includeやextend実行を契機に行いたい処理を
実装して、各モジュールに追加しておくと、トリガーメソッドとして利用可能

module MyModule
  def self.included(object)
    p "#{object} has included #{self}"
  end
end

class MyClass
  include MyModule
end
=> "MyClass has included MyModule"

インクルードされているか調べる

module MyModule; end

class MyClass
  include MyModule
end

# インクルードされているか確認
MyClass.include?(MyModule)
=> ture

# インクルード済みモジュール一覧
MyClass.included_modules
=> [MyModule, Kernel]

モジュールを自動ロードする

puts open('/Users/developer/work/mymodule.rb').read
module MyModule
  def foo
   puts 'bar'
  end
end

class MyClass
  # MyModuleが未定義の場合、指定ファイルパスを読みこむ
  autoload(:MyModule, '/Users/developer/work/mymodule.rb')

  # 自動読み込みの確認(未ロード時はファイルパスを返却。ロード済み、または自動読み込みが未設定の場合はnil返却)
  p autoload?(:MyModule)
  include Mymodule
  p autoload?(:MyModule)
end

=> "/Users/developer/work/mymodule.rb"
=> nil