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

論文紹介: "MolGAN: An implicit generative model for small molecular graphs"
論文紹介: "MolGAN: An implicit generative model for small molecular graphs"論文紹介: "MolGAN: An implicit generative model for small molecular graphs"
論文紹介: "MolGAN: An implicit generative model for small molecular graphs"Ryohei Suzuki
 
PostgreSQLアーキテクチャ入門(INSIGHT OUT 2011)
PostgreSQLアーキテクチャ入門(INSIGHT OUT 2011)PostgreSQLアーキテクチャ入門(INSIGHT OUT 2011)
PostgreSQLアーキテクチャ入門(INSIGHT OUT 2011)Uptime Technologies LLC (JP)
 
時系列分析による異常検知入門
時系列分析による異常検知入門時系列分析による異常検知入門
時系列分析による異常検知入門Yohei Sato
 
4 データ間の距離と類似度
4 データ間の距離と類似度4 データ間の距離と類似度
4 データ間の距離と類似度Seiichi Uchida
 
[DL輪読会]Unsupervised Cross-Domain Image Generation
[DL輪読会]Unsupervised Cross-Domain Image Generation[DL輪読会]Unsupervised Cross-Domain Image Generation
[DL輪読会]Unsupervised Cross-Domain Image GenerationDeep Learning JP
 
Graph Attention Network
Graph Attention NetworkGraph Attention Network
Graph Attention NetworkTakahiro Kubo
 
Kanban 101「明日から使えるかもしれないカンバン」
Kanban 101「明日から使えるかもしれないカンバン」Kanban 101「明日から使えるかもしれないカンバン」
Kanban 101「明日から使えるかもしれないカンバン」Shuji Yamada
 
推薦アルゴリズムの今までとこれから
推薦アルゴリズムの今までとこれから推薦アルゴリズムの今までとこれから
推薦アルゴリズムの今までとこれからcyberagent
 
FEPチュートリアル2021 講義3 「潜在変数が連続値、生成モデルが正規分布の場合」の改良版
FEPチュートリアル2021 講義3 「潜在変数が連続値、生成モデルが正規分布の場合」の改良版FEPチュートリアル2021 講義3 「潜在変数が連続値、生成モデルが正規分布の場合」の改良版
FEPチュートリアル2021 講義3 「潜在変数が連続値、生成モデルが正規分布の場合」の改良版Masatoshi Yoshida
 
研究分野をサーベイする
研究分野をサーベイする研究分野をサーベイする
研究分野をサーベイするTakayuki Itoh
 
【DL輪読会】SimCSE: Simple Contrastive Learning of Sentence Embeddings (EMNLP 2021)
【DL輪読会】SimCSE: Simple Contrastive Learning of Sentence Embeddings  (EMNLP 2021)【DL輪読会】SimCSE: Simple Contrastive Learning of Sentence Embeddings  (EMNLP 2021)
【DL輪読会】SimCSE: Simple Contrastive Learning of Sentence Embeddings (EMNLP 2021)Deep Learning JP
 
[DL輪読会]Understanding Black-box Predictions via Influence Functions
[DL輪読会]Understanding Black-box Predictions via Influence Functions [DL輪読会]Understanding Black-box Predictions via Influence Functions
[DL輪読会]Understanding Black-box Predictions via Influence Functions Deep Learning JP
 
機械学習モデルの判断根拠の説明(Ver.2)
機械学習モデルの判断根拠の説明(Ver.2)機械学習モデルの判断根拠の説明(Ver.2)
機械学習モデルの判断根拠の説明(Ver.2)Satoshi Hara
 
ARM CPUにおけるSIMDを用いた高速計算入門
ARM CPUにおけるSIMDを用いた高速計算入門ARM CPUにおけるSIMDを用いた高速計算入門
ARM CPUにおけるSIMDを用いた高速計算入門Fixstars Corporation
 
[DL輪読会]EfficientNet: Rethinking Model Scaling for Convolutional Neural Networks
[DL輪読会]EfficientNet: Rethinking Model Scaling for Convolutional Neural Networks[DL輪読会]EfficientNet: Rethinking Model Scaling for Convolutional Neural Networks
[DL輪読会]EfficientNet: Rethinking Model Scaling for Convolutional Neural NetworksDeep Learning JP
 
中3女子でもわかる constexpr
中3女子でもわかる constexpr中3女子でもわかる constexpr
中3女子でもわかる constexprGenya Murakami
 
PostgreSQLアンチパターン
PostgreSQLアンチパターンPostgreSQLアンチパターン
PostgreSQLアンチパターンSoudai Sone
 

What's hot (20)

論文紹介: "MolGAN: An implicit generative model for small molecular graphs"
論文紹介: "MolGAN: An implicit generative model for small molecular graphs"論文紹介: "MolGAN: An implicit generative model for small molecular graphs"
論文紹介: "MolGAN: An implicit generative model for small molecular graphs"
 
PostgreSQLアーキテクチャ入門(INSIGHT OUT 2011)
PostgreSQLアーキテクチャ入門(INSIGHT OUT 2011)PostgreSQLアーキテクチャ入門(INSIGHT OUT 2011)
PostgreSQLアーキテクチャ入門(INSIGHT OUT 2011)
 
時系列分析による異常検知入門
時系列分析による異常検知入門時系列分析による異常検知入門
時系列分析による異常検知入門
 
4 データ間の距離と類似度
4 データ間の距離と類似度4 データ間の距離と類似度
4 データ間の距離と類似度
 
[DL輪読会]Unsupervised Cross-Domain Image Generation
[DL輪読会]Unsupervised Cross-Domain Image Generation[DL輪読会]Unsupervised Cross-Domain Image Generation
[DL輪読会]Unsupervised Cross-Domain Image Generation
 
Graph Attention Network
Graph Attention NetworkGraph Attention Network
Graph Attention Network
 
Kanban 101「明日から使えるかもしれないカンバン」
Kanban 101「明日から使えるかもしれないカンバン」Kanban 101「明日から使えるかもしれないカンバン」
Kanban 101「明日から使えるかもしれないカンバン」
 
推薦アルゴリズムの今までとこれから
推薦アルゴリズムの今までとこれから推薦アルゴリズムの今までとこれから
推薦アルゴリズムの今までとこれから
 
FEPチュートリアル2021 講義3 「潜在変数が連続値、生成モデルが正規分布の場合」の改良版
FEPチュートリアル2021 講義3 「潜在変数が連続値、生成モデルが正規分布の場合」の改良版FEPチュートリアル2021 講義3 「潜在変数が連続値、生成モデルが正規分布の場合」の改良版
FEPチュートリアル2021 講義3 「潜在変数が連続値、生成モデルが正規分布の場合」の改良版
 
研究分野をサーベイする
研究分野をサーベイする研究分野をサーベイする
研究分野をサーベイする
 
ヤフー社内でやってるMySQLチューニングセミナー大公開
ヤフー社内でやってるMySQLチューニングセミナー大公開ヤフー社内でやってるMySQLチューニングセミナー大公開
ヤフー社内でやってるMySQLチューニングセミナー大公開
 
【DL輪読会】SimCSE: Simple Contrastive Learning of Sentence Embeddings (EMNLP 2021)
【DL輪読会】SimCSE: Simple Contrastive Learning of Sentence Embeddings  (EMNLP 2021)【DL輪読会】SimCSE: Simple Contrastive Learning of Sentence Embeddings  (EMNLP 2021)
【DL輪読会】SimCSE: Simple Contrastive Learning of Sentence Embeddings (EMNLP 2021)
 
Chokudai search
Chokudai searchChokudai search
Chokudai search
 
[DL輪読会]Understanding Black-box Predictions via Influence Functions
[DL輪読会]Understanding Black-box Predictions via Influence Functions [DL輪読会]Understanding Black-box Predictions via Influence Functions
[DL輪読会]Understanding Black-box Predictions via Influence Functions
 
機械学習モデルの判断根拠の説明(Ver.2)
機械学習モデルの判断根拠の説明(Ver.2)機械学習モデルの判断根拠の説明(Ver.2)
機械学習モデルの判断根拠の説明(Ver.2)
 
ARM CPUにおけるSIMDを用いた高速計算入門
ARM CPUにおけるSIMDを用いた高速計算入門ARM CPUにおけるSIMDを用いた高速計算入門
ARM CPUにおけるSIMDを用いた高速計算入門
 
[DL輪読会]EfficientNet: Rethinking Model Scaling for Convolutional Neural Networks
[DL輪読会]EfficientNet: Rethinking Model Scaling for Convolutional Neural Networks[DL輪読会]EfficientNet: Rethinking Model Scaling for Convolutional Neural Networks
[DL輪読会]EfficientNet: Rethinking Model Scaling for Convolutional Neural Networks
 
プログラムを高速化する話
プログラムを高速化する話プログラムを高速化する話
プログラムを高速化する話
 
中3女子でもわかる constexpr
中3女子でもわかる constexpr中3女子でもわかる constexpr
中3女子でもわかる constexpr
 
PostgreSQLアンチパターン
PostgreSQLアンチパターンPostgreSQLアンチパターン
PostgreSQLアンチパターン
 

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
 
メールの暗号化
メールの暗号化メールの暗号化
メールの暗号化
 
文字化け
文字化け文字化け
文字化け
 
進捗と品質
進捗と品質進捗と品質
進捗と品質
 
アジャイルジャパン長野サテライト
アジャイルジャパン長野サテライトアジャイルジャパン長野サテライト
アジャイルジャパン長野サテライト
 
🍣=🍺
🍣=🍺🍣=🍺
🍣=🍺
 

Recently uploaded

TSAL operation mechanism and circuit diagram.pdf
TSAL operation mechanism and circuit diagram.pdfTSAL operation mechanism and circuit diagram.pdf
TSAL operation mechanism and circuit diagram.pdftaisei2219
 
【早稲田AI研究会 講義資料】3DスキャンとTextTo3Dのツールを知ろう!(Vol.1)
【早稲田AI研究会 講義資料】3DスキャンとTextTo3Dのツールを知ろう!(Vol.1)【早稲田AI研究会 講義資料】3DスキャンとTextTo3Dのツールを知ろう!(Vol.1)
【早稲田AI研究会 講義資料】3DスキャンとTextTo3Dのツールを知ろう!(Vol.1)Hiroki Ichikura
 
AWS の OpenShift サービス (ROSA) を使った OpenShift Virtualizationの始め方.pdf
AWS の OpenShift サービス (ROSA) を使った OpenShift Virtualizationの始め方.pdfAWS の OpenShift サービス (ROSA) を使った OpenShift Virtualizationの始め方.pdf
AWS の OpenShift サービス (ROSA) を使った OpenShift Virtualizationの始め方.pdfFumieNakayama
 
論文紹介:Semantic segmentation using Vision Transformers: A survey
論文紹介:Semantic segmentation using Vision Transformers: A survey論文紹介:Semantic segmentation using Vision Transformers: A survey
論文紹介:Semantic segmentation using Vision Transformers: A surveyToru Tamaki
 
デジタル・フォレンジックの最新動向(2024年4月27日情洛会総会特別講演スライド)
デジタル・フォレンジックの最新動向(2024年4月27日情洛会総会特別講演スライド)デジタル・フォレンジックの最新動向(2024年4月27日情洛会総会特別講演スライド)
デジタル・フォレンジックの最新動向(2024年4月27日情洛会総会特別講演スライド)UEHARA, Tetsutaro
 
モーダル間の変換後の一致性とジャンル表を用いた解釈可能性の考察 ~Text-to-MusicとText-To-ImageかつImage-to-Music...
モーダル間の変換後の一致性とジャンル表を用いた解釈可能性の考察  ~Text-to-MusicとText-To-ImageかつImage-to-Music...モーダル間の変換後の一致性とジャンル表を用いた解釈可能性の考察  ~Text-to-MusicとText-To-ImageかつImage-to-Music...
モーダル間の変換後の一致性とジャンル表を用いた解釈可能性の考察 ~Text-to-MusicとText-To-ImageかつImage-to-Music...博三 太田
 
クラウドネイティブなサーバー仮想化基盤 - OpenShift Virtualization.pdf
クラウドネイティブなサーバー仮想化基盤 - OpenShift Virtualization.pdfクラウドネイティブなサーバー仮想化基盤 - OpenShift Virtualization.pdf
クラウドネイティブなサーバー仮想化基盤 - OpenShift Virtualization.pdfFumieNakayama
 
Open Source UN-Conference 2024 Kawagoe - 独自OS「DaisyOS GB」の紹介
Open Source UN-Conference 2024 Kawagoe - 独自OS「DaisyOS GB」の紹介Open Source UN-Conference 2024 Kawagoe - 独自OS「DaisyOS GB」の紹介
Open Source UN-Conference 2024 Kawagoe - 独自OS「DaisyOS GB」の紹介Yuma Ohgami
 
論文紹介:Automated Classification of Model Errors on ImageNet
論文紹介:Automated Classification of Model Errors on ImageNet論文紹介:Automated Classification of Model Errors on ImageNet
論文紹介:Automated Classification of Model Errors on ImageNetToru Tamaki
 
論文紹介:Content-Aware Token Sharing for Efficient Semantic Segmentation With Vis...
論文紹介:Content-Aware Token Sharing for Efficient Semantic Segmentation With Vis...論文紹介:Content-Aware Token Sharing for Efficient Semantic Segmentation With Vis...
論文紹介:Content-Aware Token Sharing for Efficient Semantic Segmentation With Vis...Toru Tamaki
 
SOPを理解する 2024/04/19 の勉強会で発表されたものです
SOPを理解する       2024/04/19 の勉強会で発表されたものですSOPを理解する       2024/04/19 の勉強会で発表されたものです
SOPを理解する 2024/04/19 の勉強会で発表されたものですiPride Co., Ltd.
 
TataPixel: 畳の異方性を利用した切り替え可能なディスプレイの提案
TataPixel: 畳の異方性を利用した切り替え可能なディスプレイの提案TataPixel: 畳の異方性を利用した切り替え可能なディスプレイの提案
TataPixel: 畳の異方性を利用した切り替え可能なディスプレイの提案sugiuralab
 

Recently uploaded (12)

TSAL operation mechanism and circuit diagram.pdf
TSAL operation mechanism and circuit diagram.pdfTSAL operation mechanism and circuit diagram.pdf
TSAL operation mechanism and circuit diagram.pdf
 
【早稲田AI研究会 講義資料】3DスキャンとTextTo3Dのツールを知ろう!(Vol.1)
【早稲田AI研究会 講義資料】3DスキャンとTextTo3Dのツールを知ろう!(Vol.1)【早稲田AI研究会 講義資料】3DスキャンとTextTo3Dのツールを知ろう!(Vol.1)
【早稲田AI研究会 講義資料】3DスキャンとTextTo3Dのツールを知ろう!(Vol.1)
 
AWS の OpenShift サービス (ROSA) を使った OpenShift Virtualizationの始め方.pdf
AWS の OpenShift サービス (ROSA) を使った OpenShift Virtualizationの始め方.pdfAWS の OpenShift サービス (ROSA) を使った OpenShift Virtualizationの始め方.pdf
AWS の OpenShift サービス (ROSA) を使った OpenShift Virtualizationの始め方.pdf
 
論文紹介:Semantic segmentation using Vision Transformers: A survey
論文紹介:Semantic segmentation using Vision Transformers: A survey論文紹介:Semantic segmentation using Vision Transformers: A survey
論文紹介:Semantic segmentation using Vision Transformers: A survey
 
デジタル・フォレンジックの最新動向(2024年4月27日情洛会総会特別講演スライド)
デジタル・フォレンジックの最新動向(2024年4月27日情洛会総会特別講演スライド)デジタル・フォレンジックの最新動向(2024年4月27日情洛会総会特別講演スライド)
デジタル・フォレンジックの最新動向(2024年4月27日情洛会総会特別講演スライド)
 
モーダル間の変換後の一致性とジャンル表を用いた解釈可能性の考察 ~Text-to-MusicとText-To-ImageかつImage-to-Music...
モーダル間の変換後の一致性とジャンル表を用いた解釈可能性の考察  ~Text-to-MusicとText-To-ImageかつImage-to-Music...モーダル間の変換後の一致性とジャンル表を用いた解釈可能性の考察  ~Text-to-MusicとText-To-ImageかつImage-to-Music...
モーダル間の変換後の一致性とジャンル表を用いた解釈可能性の考察 ~Text-to-MusicとText-To-ImageかつImage-to-Music...
 
クラウドネイティブなサーバー仮想化基盤 - OpenShift Virtualization.pdf
クラウドネイティブなサーバー仮想化基盤 - OpenShift Virtualization.pdfクラウドネイティブなサーバー仮想化基盤 - OpenShift Virtualization.pdf
クラウドネイティブなサーバー仮想化基盤 - OpenShift Virtualization.pdf
 
Open Source UN-Conference 2024 Kawagoe - 独自OS「DaisyOS GB」の紹介
Open Source UN-Conference 2024 Kawagoe - 独自OS「DaisyOS GB」の紹介Open Source UN-Conference 2024 Kawagoe - 独自OS「DaisyOS GB」の紹介
Open Source UN-Conference 2024 Kawagoe - 独自OS「DaisyOS GB」の紹介
 
論文紹介:Automated Classification of Model Errors on ImageNet
論文紹介:Automated Classification of Model Errors on ImageNet論文紹介:Automated Classification of Model Errors on ImageNet
論文紹介:Automated Classification of Model Errors on ImageNet
 
論文紹介:Content-Aware Token Sharing for Efficient Semantic Segmentation With Vis...
論文紹介:Content-Aware Token Sharing for Efficient Semantic Segmentation With Vis...論文紹介:Content-Aware Token Sharing for Efficient Semantic Segmentation With Vis...
論文紹介:Content-Aware Token Sharing for Efficient Semantic Segmentation With Vis...
 
SOPを理解する 2024/04/19 の勉強会で発表されたものです
SOPを理解する       2024/04/19 の勉強会で発表されたものですSOPを理解する       2024/04/19 の勉強会で発表されたものです
SOPを理解する 2024/04/19 の勉強会で発表されたものです
 
TataPixel: 畳の異方性を利用した切り替え可能なディスプレイの提案
TataPixel: 畳の異方性を利用した切り替え可能なディスプレイの提案TataPixel: 畳の異方性を利用した切り替え可能なディスプレイの提案
TataPixel: 畳の異方性を利用した切り替え可能なディスプレイの提案
 

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