SlideShare a Scribd company logo
1 of 27
Download to read offline
Rubyの黒魔術
              とみたまさひろ
                2010-03-13



Rubyの黒魔術            Powered by Rabbit 0.6.4
自己紹介
     ✓ とみた まさひろ
     ✓ プログラマー
     ✓ mailto:tommy@tmtm.org
     ✓ id:tmtms
     ✓ @tmtms
                                          1/26
Rubyの黒魔術                       Powered by Rabbit 0.6.4
自己紹介

     ✓ 日本Rubyの会
     ✓ 日本MySQLユーザ会
     ✓ Ruby/MySQL ライブラリ
     ✓ Ruby歴, MySQL歴 十数年

                                      2/26
Rubyの黒魔術                   Powered by Rabbit 0.6.4
自己紹介




           こんな本書きました

                                  3/26
Rubyの黒魔術               Powered by Rabbit 0.6.4
Ruby                4/26
Rubyの黒魔術   Powered by Rabbit 0.6.4
Rubyの特徴


     ✓ オブジェクト指向
     ✓ スクリプト
     ✓ 動的


                                 5/26
Rubyの黒魔術              Powered by Rabbit 0.6.4
動的:
  黒魔術
Rubyの黒魔術
                      6/26
           Powered by Rabbit 0.6.4
メソッドが実行時に生成される

           hoge(123) #=> エラー
           def hoge(v)
           end
           ------------------------
           def hoge(v)
           end
           hoge(123) #=> OK
                                             7/26
Rubyの黒魔術                          Powered by Rabbit 0.6.4
クラスが実行時に生成される

           A.new #=> エラー
           class A
           end
           ------------------------
           class A
           end
           A.new #=> OK
                                             8/26
Rubyの黒魔術                          Powered by Rabbit 0.6.4
パース時ではなくて実行時


           if rand(2) == 0
             class A < String; end
           else
             class A < Integer; end
           end

                                             9/26
Rubyの黒魔術                          Powered by Rabbit 0.6.4
オープンクラス
   既存のクラスを変更できる

           class String
             def balse!
               puts "目が、目がぁ!"
             end
           end
           "ムスカ".balse!
                                    10/26
Rubyの黒魔術                    Powered by Rabbit 0.6.4
特異メソッド

   特定のオブジェクトだけにメソッド追加
           musuka = "ムスカ"
           def musuka.balse!
             puts "目が、目がぁ!"
           end
           musuka.balse!
           "レプカ".balse! # undefined method `balse!'


                                                       11/26
Rubyの黒魔術                                       Powered by Rabbit 0.6.4
演算子もメソッド
           3+5      #=> 8
           3.+(5)   #=> 8
           # 既存の演算子の書き換えも可能
           class Fixnum
             def +(n)
               self * n
             end
           end
           3+5     #=> 15
                                    12/26
Rubyの黒魔術                    Powered by Rabbit 0.6.4
クラスもオブジェクト


           c = Class.new(SuperClass)   # 名無しクラス
           p c       #=> #<Class:0xb744ac84>
           c.new     # ちゃんとクラス
           Hoge = c # 定数に代入すると名前がつく
           p c       #=> Hoge
           Hoge.new



                                                   13/26
Rubyの黒魔術                                   Powered by Rabbit 0.6.4
メソッドも動的に生成

           class Hoge
             define_method :hoge do
               123
             end
           end
           Hoge.new.hoge #=> 123

                                          14/26
Rubyの黒魔術                          Powered by Rabbit 0.6.4
たとえばこんな感じ

           class A
             [:hoge, :fuga, :hage].each do |name|
               define_method name do
                 name.to_s.capitalize
               end
             end
           end
           A.new.hoge #=> "Hoge"
           A.new.fuga #=> "Fuga"

                                                     15/26
Rubyの黒魔術                                     Powered by Rabbit 0.6.4
定数の動的取得


           class Hoge
             C = 123
             D = "abc"
           end
           Hoge.constants        #=> ["D", "C"]
           Hoge.const_get("C")   #=> 123


                                                   16/26
Rubyの黒魔術                                   Powered by Rabbit 0.6.4
文字列からメソッド呼び出し

           name = "HogeFuga/nanika"
           cname, mname = name.split('/')
           lib = cname.gsub(/([A-Z])/,'_1').
             downcase.sub(/^_/,'') #=> "hoge_fuga"
           require lib
           klass = self.class.const_get(cname)
           obj = klass.new
           obj.method(mname).call

                                                      17/26
Rubyの黒魔術                                      Powered by Rabbit 0.6.4
宣言っぽいもの


           define_attribute :port do
             range 1..65535
             description 'TCP/IP port number'
           end


                                                 18/26
Rubyの黒魔術                                 Powered by Rabbit 0.6.4
宣言っぽいもの
           def define_attribute(name, &block)
             Attribute.new(&block)
           end
           class Attribute
             def initialize(&block)
               self.instance_eval &block
             end
             def range(r)
               ...
             end
             def description(d)
               ...
             end
           end
                                                        19/26
Rubyの黒魔術                                        Powered by Rabbit 0.6.4
設定ファイル

           $proto = "smtp"
           $hostname = "example.com"
           $port = 25
   ↑を load "filename"
   グローバル変数はちょっと…
                                          20/26
Rubyの黒魔術                          Powered by Rabbit 0.6.4
設定ファイル
   ハッシュとか

           $conf = {
             :proto    => "smtp",
             :hostname => "example.com",
             :port     => 25,
           }
   ↑を load "filename"
   設定ファイルっぽくない。                              21/26
Rubyの黒魔術                             Powered by Rabbit 0.6.4
設定ファイル


           proto "smtp"
           hostname "example.com"
           port 25
   これを eval

                                            22/26
Rubyの黒魔術                            Powered by Rabbit 0.6.4
設定ファイル
           class Config
             def initialize(filename)
               eval File.read(filename)
             end
             def proto(p)
               ...
             end
             def hostname(h)
               ...
             end
             def port(n)
               ...
             end
           end
                                                  23/26
Rubyの黒魔術                                  Powered by Rabbit 0.6.4
その他
     ✓ クラスが継承された時に実行され
       るメソッド
     ✓ メソッドが存在しない時に実行さ
       れるメソッド
     ✓ メソッドが追加/削除された時に
       実行されるメソッド
     ✓ クラスの祖先を調べる
     ✓ オブジェクトにメソッドがあるか?24/26
Rubyの黒魔術               Powered by Rabbit 0.6.4
黒魔術も
    正しく使え
    ば白魔術
Rubyの黒魔術
                   25/26
           Powered by Rabbit 0.6.4
ご清聴あり
  がとうござ
   いました
Rubyの黒魔術
                   26/26
           Powered by Rabbit 0.6.4

More Related Content

What's hot

【DL輪読会】High-Resolution Image Synthesis with Latent Diffusion Models
【DL輪読会】High-Resolution Image Synthesis with Latent Diffusion Models【DL輪読会】High-Resolution Image Synthesis with Latent Diffusion Models
【DL輪読会】High-Resolution Image Synthesis with Latent Diffusion ModelsDeep Learning JP
 
Pythonの理解を試みる 〜バイトコードインタプリタを作成する〜
Pythonの理解を試みる 〜バイトコードインタプリタを作成する〜Pythonの理解を試みる 〜バイトコードインタプリタを作成する〜
Pythonの理解を試みる 〜バイトコードインタプリタを作成する〜Preferred Networks
 
PyTorchLightning ベース Hydra+MLFlow+Optuna による機械学習開発環境の構築
PyTorchLightning ベース Hydra+MLFlow+Optuna による機械学習開発環境の構築PyTorchLightning ベース Hydra+MLFlow+Optuna による機械学習開発環境の構築
PyTorchLightning ベース Hydra+MLFlow+Optuna による機械学習開発環境の構築Kosuke Shinoda
 
【DL輪読会】Hyena Hierarchy: Towards Larger Convolutional Language Models
【DL輪読会】Hyena Hierarchy: Towards Larger Convolutional Language Models【DL輪読会】Hyena Hierarchy: Towards Larger Convolutional Language Models
【DL輪読会】Hyena Hierarchy: Towards Larger Convolutional Language ModelsDeep Learning JP
 
【DL輪読会】言語以外でのTransformerのまとめ (ViT, Perceiver, Frozen Pretrained Transformer etc)
【DL輪読会】言語以外でのTransformerのまとめ (ViT, Perceiver, Frozen Pretrained Transformer etc)【DL輪読会】言語以外でのTransformerのまとめ (ViT, Perceiver, Frozen Pretrained Transformer etc)
【DL輪読会】言語以外でのTransformerのまとめ (ViT, Perceiver, Frozen Pretrained Transformer etc)Deep Learning JP
 
[DL輪読会]GQNと関連研究,世界モデルとの関係について
[DL輪読会]GQNと関連研究,世界モデルとの関係について[DL輪読会]GQNと関連研究,世界モデルとの関係について
[DL輪読会]GQNと関連研究,世界モデルとの関係についてDeep Learning JP
 
多目的強凸最適化のパレート集合のトポロジー
多目的強凸最適化のパレート集合のトポロジー多目的強凸最適化のパレート集合のトポロジー
多目的強凸最適化のパレート集合のトポロジーKLab Inc. / Tech
 
今から始める Lens/Prism
今から始める Lens/Prism今から始める Lens/Prism
今から始める Lens/PrismNaoki Aoyama
 
Private Recommender Systems: How Can Users Build Their Own Fair Recommender S...
Private Recommender Systems: How Can Users Build Their Own Fair Recommender S...Private Recommender Systems: How Can Users Build Their Own Fair Recommender S...
Private Recommender Systems: How Can Users Build Their Own Fair Recommender S...joisino
 
テスト文字列に「うんこ」と入れるな
テスト文字列に「うんこ」と入れるなテスト文字列に「うんこ」と入れるな
テスト文字列に「うんこ」と入れるなKentaro Matsui
 
何となく勉強した気分になれるパーサ入門
何となく勉強した気分になれるパーサ入門何となく勉強した気分になれるパーサ入門
何となく勉強した気分になれるパーサ入門masayoshi takahashi
 
CPU / GPU高速化セミナー!性能モデルの理論と実践:理論編
CPU / GPU高速化セミナー!性能モデルの理論と実践:理論編CPU / GPU高速化セミナー!性能モデルの理論と実践:理論編
CPU / GPU高速化セミナー!性能モデルの理論と実践:理論編Fixstars Corporation
 
研究発表を準備する(2022年版)
研究発表を準備する(2022年版)研究発表を準備する(2022年版)
研究発表を準備する(2022年版)Takayuki Itoh
 
Anaconda navigatorのアップデートが終わらないときの対処方法メモ
Anaconda navigatorのアップデートが終わらないときの対処方法メモAnaconda navigatorのアップデートが終わらないときの対処方法メモ
Anaconda navigatorのアップデートが終わらないときの対処方法メモayohe
 
Transformerを雰囲気で理解する
Transformerを雰囲気で理解するTransformerを雰囲気で理解する
Transformerを雰囲気で理解するAtsukiYamaguchi1
 
Control as Inference (強化学習とベイズ統計)
Control as Inference (強化学習とベイズ統計)Control as Inference (強化学習とベイズ統計)
Control as Inference (強化学習とベイズ統計)Shohei Taniguchi
 
[DL輪読会]Temporal DifferenceVariationalAuto-Encoder
[DL輪読会]Temporal DifferenceVariationalAuto-Encoder[DL輪読会]Temporal DifferenceVariationalAuto-Encoder
[DL輪読会]Temporal DifferenceVariationalAuto-EncoderDeep Learning JP
 
[DL輪読会]Flow-based Deep Generative Models
[DL輪読会]Flow-based Deep Generative Models[DL輪読会]Flow-based Deep Generative Models
[DL輪読会]Flow-based Deep Generative ModelsDeep Learning JP
 

What's hot (20)

【DL輪読会】High-Resolution Image Synthesis with Latent Diffusion Models
【DL輪読会】High-Resolution Image Synthesis with Latent Diffusion Models【DL輪読会】High-Resolution Image Synthesis with Latent Diffusion Models
【DL輪読会】High-Resolution Image Synthesis with Latent Diffusion Models
 
音声認識と深層学習
音声認識と深層学習音声認識と深層学習
音声認識と深層学習
 
Pythonの理解を試みる 〜バイトコードインタプリタを作成する〜
Pythonの理解を試みる 〜バイトコードインタプリタを作成する〜Pythonの理解を試みる 〜バイトコードインタプリタを作成する〜
Pythonの理解を試みる 〜バイトコードインタプリタを作成する〜
 
PyTorchLightning ベース Hydra+MLFlow+Optuna による機械学習開発環境の構築
PyTorchLightning ベース Hydra+MLFlow+Optuna による機械学習開発環境の構築PyTorchLightning ベース Hydra+MLFlow+Optuna による機械学習開発環境の構築
PyTorchLightning ベース Hydra+MLFlow+Optuna による機械学習開発環境の構築
 
【DL輪読会】Hyena Hierarchy: Towards Larger Convolutional Language Models
【DL輪読会】Hyena Hierarchy: Towards Larger Convolutional Language Models【DL輪読会】Hyena Hierarchy: Towards Larger Convolutional Language Models
【DL輪読会】Hyena Hierarchy: Towards Larger Convolutional Language Models
 
【DL輪読会】言語以外でのTransformerのまとめ (ViT, Perceiver, Frozen Pretrained Transformer etc)
【DL輪読会】言語以外でのTransformerのまとめ (ViT, Perceiver, Frozen Pretrained Transformer etc)【DL輪読会】言語以外でのTransformerのまとめ (ViT, Perceiver, Frozen Pretrained Transformer etc)
【DL輪読会】言語以外でのTransformerのまとめ (ViT, Perceiver, Frozen Pretrained Transformer etc)
 
[DL輪読会]GQNと関連研究,世界モデルとの関係について
[DL輪読会]GQNと関連研究,世界モデルとの関係について[DL輪読会]GQNと関連研究,世界モデルとの関係について
[DL輪読会]GQNと関連研究,世界モデルとの関係について
 
多目的強凸最適化のパレート集合のトポロジー
多目的強凸最適化のパレート集合のトポロジー多目的強凸最適化のパレート集合のトポロジー
多目的強凸最適化のパレート集合のトポロジー
 
今から始める Lens/Prism
今から始める Lens/Prism今から始める Lens/Prism
今から始める Lens/Prism
 
Private Recommender Systems: How Can Users Build Their Own Fair Recommender S...
Private Recommender Systems: How Can Users Build Their Own Fair Recommender S...Private Recommender Systems: How Can Users Build Their Own Fair Recommender S...
Private Recommender Systems: How Can Users Build Their Own Fair Recommender S...
 
テスト文字列に「うんこ」と入れるな
テスト文字列に「うんこ」と入れるなテスト文字列に「うんこ」と入れるな
テスト文字列に「うんこ」と入れるな
 
何となく勉強した気分になれるパーサ入門
何となく勉強した気分になれるパーサ入門何となく勉強した気分になれるパーサ入門
何となく勉強した気分になれるパーサ入門
 
ELBO型VAEのダメなところ
ELBO型VAEのダメなところELBO型VAEのダメなところ
ELBO型VAEのダメなところ
 
CPU / GPU高速化セミナー!性能モデルの理論と実践:理論編
CPU / GPU高速化セミナー!性能モデルの理論と実践:理論編CPU / GPU高速化セミナー!性能モデルの理論と実践:理論編
CPU / GPU高速化セミナー!性能モデルの理論と実践:理論編
 
研究発表を準備する(2022年版)
研究発表を準備する(2022年版)研究発表を準備する(2022年版)
研究発表を準備する(2022年版)
 
Anaconda navigatorのアップデートが終わらないときの対処方法メモ
Anaconda navigatorのアップデートが終わらないときの対処方法メモAnaconda navigatorのアップデートが終わらないときの対処方法メモ
Anaconda navigatorのアップデートが終わらないときの対処方法メモ
 
Transformerを雰囲気で理解する
Transformerを雰囲気で理解するTransformerを雰囲気で理解する
Transformerを雰囲気で理解する
 
Control as Inference (強化学習とベイズ統計)
Control as Inference (強化学習とベイズ統計)Control as Inference (強化学習とベイズ統計)
Control as Inference (強化学習とベイズ統計)
 
[DL輪読会]Temporal DifferenceVariationalAuto-Encoder
[DL輪読会]Temporal DifferenceVariationalAuto-Encoder[DL輪読会]Temporal DifferenceVariationalAuto-Encoder
[DL輪読会]Temporal DifferenceVariationalAuto-Encoder
 
[DL輪読会]Flow-based Deep Generative Models
[DL輪読会]Flow-based Deep Generative Models[DL輪読会]Flow-based Deep Generative Models
[DL輪読会]Flow-based Deep Generative Models
 

More from Masahiro Tomita

More from Masahiro Tomita (20)

お前の罪を数えろ
お前の罪を数えろお前の罪を数えろ
お前の罪を数えろ
 
Ruby 2.5
Ruby 2.5Ruby 2.5
Ruby 2.5
 
本当はこわいMySQLプロトコル
本当はこわいMySQLプロトコル本当はこわいMySQLプロトコル
本当はこわいMySQLプロトコル
 
ネットワークこわい
ネットワークこわいネットワークこわい
ネットワークこわい
 
CSV
CSVCSV
CSV
 
MySQLの文字コード事情 2017春版
MySQLの文字コード事情 2017春版MySQLの文字コード事情 2017春版
MySQLの文字コード事情 2017春版
 
MySQLの文字コード事情 2017版
MySQLの文字コード事情 2017版MySQLの文字コード事情 2017版
MySQLの文字コード事情 2017版
 
Ruby24
Ruby24Ruby24
Ruby24
 
MySQLの文字コード事情
MySQLの文字コード事情MySQLの文字コード事情
MySQLの文字コード事情
 
進捗と品質
進捗と品質進捗と品質
進捗と品質
 
MySQLを拡張する
MySQLを拡張するMySQLを拡張する
MySQLを拡張する
 
「理論から学ぶデータベース実践入門」読書会スペシャル
「理論から学ぶデータベース実践入門」読書会スペシャル「理論から学ぶデータベース実践入門」読書会スペシャル
「理論から学ぶデータベース実践入門」読書会スペシャル
 
MyNAができるまで
MyNAができるまでMyNAができるまで
MyNAができるまで
 
文字化け
文字化け文字化け
文字化け
 
Crystal
CrystalCrystal
Crystal
 
メールの暗号化
メールの暗号化メールの暗号化
メールの暗号化
 
文字化け
文字化け文字化け
文字化け
 
進捗と品質
進捗と品質進捗と品質
進捗と品質
 
アジャイルジャパン長野サテライト
アジャイルジャパン長野サテライトアジャイルジャパン長野サテライト
アジャイルジャパン長野サテライト
 
🍣=🍺
🍣=🍺🍣=🍺
🍣=🍺
 

Rubyの黒魔術

  • 1. Rubyの黒魔術 とみたまさひろ 2010-03-13 Rubyの黒魔術 Powered by Rabbit 0.6.4
  • 2. 自己紹介 ✓ とみた まさひろ ✓ プログラマー ✓ mailto:tommy@tmtm.org ✓ id:tmtms ✓ @tmtms 1/26 Rubyの黒魔術 Powered by Rabbit 0.6.4
  • 3. 自己紹介 ✓ 日本Rubyの会 ✓ 日本MySQLユーザ会 ✓ Ruby/MySQL ライブラリ ✓ Ruby歴, MySQL歴 十数年 2/26 Rubyの黒魔術 Powered by Rabbit 0.6.4
  • 4. 自己紹介 こんな本書きました 3/26 Rubyの黒魔術 Powered by Rabbit 0.6.4
  • 5. Ruby 4/26 Rubyの黒魔術 Powered by Rabbit 0.6.4
  • 6. Rubyの特徴 ✓ オブジェクト指向 ✓ スクリプト ✓ 動的 5/26 Rubyの黒魔術 Powered by Rabbit 0.6.4
  • 7. 動的: 黒魔術 Rubyの黒魔術 6/26 Powered by Rabbit 0.6.4
  • 8. メソッドが実行時に生成される hoge(123) #=> エラー def hoge(v) end ------------------------ def hoge(v) end hoge(123) #=> OK 7/26 Rubyの黒魔術 Powered by Rabbit 0.6.4
  • 9. クラスが実行時に生成される A.new #=> エラー class A end ------------------------ class A end A.new #=> OK 8/26 Rubyの黒魔術 Powered by Rabbit 0.6.4
  • 10. パース時ではなくて実行時 if rand(2) == 0 class A < String; end else class A < Integer; end end 9/26 Rubyの黒魔術 Powered by Rabbit 0.6.4
  • 11. オープンクラス 既存のクラスを変更できる class String def balse! puts "目が、目がぁ!" end end "ムスカ".balse! 10/26 Rubyの黒魔術 Powered by Rabbit 0.6.4
  • 12. 特異メソッド 特定のオブジェクトだけにメソッド追加 musuka = "ムスカ" def musuka.balse! puts "目が、目がぁ!" end musuka.balse! "レプカ".balse! # undefined method `balse!' 11/26 Rubyの黒魔術 Powered by Rabbit 0.6.4
  • 13. 演算子もメソッド 3+5 #=> 8 3.+(5) #=> 8 # 既存の演算子の書き換えも可能 class Fixnum def +(n) self * n end end 3+5 #=> 15 12/26 Rubyの黒魔術 Powered by Rabbit 0.6.4
  • 14. クラスもオブジェクト c = Class.new(SuperClass) # 名無しクラス p c #=> #<Class:0xb744ac84> c.new # ちゃんとクラス Hoge = c # 定数に代入すると名前がつく p c #=> Hoge Hoge.new 13/26 Rubyの黒魔術 Powered by Rabbit 0.6.4
  • 15. メソッドも動的に生成 class Hoge define_method :hoge do 123 end end Hoge.new.hoge #=> 123 14/26 Rubyの黒魔術 Powered by Rabbit 0.6.4
  • 16. たとえばこんな感じ class A [:hoge, :fuga, :hage].each do |name| define_method name do name.to_s.capitalize end end end A.new.hoge #=> "Hoge" A.new.fuga #=> "Fuga" 15/26 Rubyの黒魔術 Powered by Rabbit 0.6.4
  • 17. 定数の動的取得 class Hoge C = 123 D = "abc" end Hoge.constants #=> ["D", "C"] Hoge.const_get("C") #=> 123 16/26 Rubyの黒魔術 Powered by Rabbit 0.6.4
  • 18. 文字列からメソッド呼び出し name = "HogeFuga/nanika" cname, mname = name.split('/') lib = cname.gsub(/([A-Z])/,'_1'). downcase.sub(/^_/,'') #=> "hoge_fuga" require lib klass = self.class.const_get(cname) obj = klass.new obj.method(mname).call 17/26 Rubyの黒魔術 Powered by Rabbit 0.6.4
  • 19. 宣言っぽいもの define_attribute :port do range 1..65535 description 'TCP/IP port number' end 18/26 Rubyの黒魔術 Powered by Rabbit 0.6.4
  • 20. 宣言っぽいもの def define_attribute(name, &block) Attribute.new(&block) end class Attribute def initialize(&block) self.instance_eval &block end def range(r) ... end def description(d) ... end end 19/26 Rubyの黒魔術 Powered by Rabbit 0.6.4
  • 21. 設定ファイル $proto = "smtp" $hostname = "example.com" $port = 25 ↑を load "filename" グローバル変数はちょっと… 20/26 Rubyの黒魔術 Powered by Rabbit 0.6.4
  • 22. 設定ファイル ハッシュとか $conf = { :proto => "smtp", :hostname => "example.com", :port => 25, } ↑を load "filename" 設定ファイルっぽくない。 21/26 Rubyの黒魔術 Powered by Rabbit 0.6.4
  • 23. 設定ファイル proto "smtp" hostname "example.com" port 25 これを eval 22/26 Rubyの黒魔術 Powered by Rabbit 0.6.4
  • 24. 設定ファイル class Config def initialize(filename) eval File.read(filename) end def proto(p) ... end def hostname(h) ... end def port(n) ... end end 23/26 Rubyの黒魔術 Powered by Rabbit 0.6.4
  • 25. その他 ✓ クラスが継承された時に実行され るメソッド ✓ メソッドが存在しない時に実行さ れるメソッド ✓ メソッドが追加/削除された時に 実行されるメソッド ✓ クラスの祖先を調べる ✓ オブジェクトにメソッドがあるか?24/26 Rubyの黒魔術 Powered by Rabbit 0.6.4
  • 26. 黒魔術も 正しく使え ば白魔術 Rubyの黒魔術 25/26 Powered by Rabbit 0.6.4
  • 27. ご清聴あり がとうござ いました Rubyの黒魔術 26/26 Powered by Rabbit 0.6.4