Tbpgr Blog

Recruiting Operations tbpgr(てぃーびー) のブログ

Ruby | 全く役に立たない3つの少し特殊な処理

概要

全く役に立たない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