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を用いる
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