概要
全く役に立たない3つの少し特殊な処理
はじめに
この記事の内容を読んでも実際に役に立つ機会はないでしょう。
1.半角スペースを含むメソッド
send経由なら呼び出し可能。
直接予防とすると、スペースが区切り文字として見なされてしまってエラーになる。
サンプルコード
# encoding: utf-8 class Hoge define_method "before_space after_space".to_sym do "contain space method" end end # 直接呼び出そうとすると半角スペースがあるためエラーになる # Hoge.new.before_space after_space # 文字列としてsendで呼び出しは可能 puts Hoge.new.send 'before_space after_space' # 文字列としてmethodで呼び出しは可能 puts Hoge.new.method('before_space after_space').call
出力
"contain space method" "contain space method"
2.予約語を利用したメソッド
予約語を利用したメソッドは、レシーバー付きもしくはsendメソッド経由なら利用可能。
レシーバーなしで利用すると予約語と衝突してエラーになる。
サンプルコード
# encoding: utf-8 class Hoge def class(c) c end def inner(c) # 予約語のclassと見なされてエラーになる。 # class c # レシーバー付きなら呼び出し可能 self.class c end def inner_send(c) # sendでの呼び出しは可能 send :class, c end end puts Hoge.new.class 'msg' puts Hoge.new.inner 'msg' puts Hoge.new.inner_send 'msg'
出力
"msg" "msg" "msg"
3.__END__メソッドを作る
これも予約語の一種ですが、スクリプトの終了を知らせる__END__をメソッドとして
定義した場合の挙動について。
式の一部として利用すると自作メソッドが呼ばれる
メソッドの引数として利用すると自作メソッドが呼ばれる
単独で利用すると予約語として動作する
サンプルコード
# encoding: utf-8 require 'tbpgr_utils' def __END__ puts "hoge" end tmp = __END__ send :__END__ puts "1111111111" __END__.to_s puts "2222222222" __END__ puts "3333333333"
出力
※最後の__END__が有効になっているため3333333333が出力されない
hoge hoge 1111111111 hoge 2222222222