わんくま東京#38 lt 「func と ref / out 小咄」
DESCRIPTION
@ わんくま同盟 東京勉強会 #38 - ライトニングトーク大集合!!TRANSCRIPT
わんくま同盟 東京勉強会 #38
Func<> と ref / out 小咄
※例によって強引な取り組みです※
takeshik
わんくま同盟 東京勉強会 #38
自己紹介• 自称変態 C# プログラマ• MetaTweet は LINQ まみれどころではない• 真面目に書いてるつもりなんですけどねえ…• それ C# じゃないとか散々な言われようで
す• 最近式という概念の美しさに取り憑かれてます
•LINQ はメソッド形式で使ってこそでしょ!!
わんくま同盟 東京勉強会 #38
私には嫌いなものがある!• ローカル変数が大嫌いです
– できれば、できるだけ使いたくない!– var かどうかとかそういう次元じゃない!
• その中で最も憎たらしいのは– 初期化を欠いた宣言を見ると憤りを感じる– 仕方なく書いてるんだからね!!!!!!!!!
int value; // ← これ!!int.Parse("1234", out value); // ↑ こいつのせいで!!!
わんくま同盟 東京勉強会 #38
私には最近興味を持つものがある!• 多値返却ってクールだよねー… ( はぁと
– 多値返却があれば ref とか out とかいらないんじゃね!?いらないって!!
• 忌々しいローカル変数宣言を滅ぼせる!!• よし!自分で多値返却もどきを作るぞ!!
– 関数オブジェクトに拡張メソッドぶち込んで※
ごにょごにょすれば万事解決!!• よし、まずは関数のプロトタイプから定義
だ!• ※作るにあたって、拡張メソッドである必要性はありません
わんくま同盟 東京勉強会 #38
だがしかし
わんくま同盟 東京勉強会 #38
重大な問題を発見しました!• Func<> や Action<> は………
ref / out 引数を含むメソッドを……受け止められない!!!!!!!
• … ところで、typeof(Func<>) とかtypeof(Dictionary<,>) って書くと
開いた ( 完全に具象化されていない )ジェネリック型オブジェクトが得られるんです。知りませんでした。びっくり!
わんくま同盟 東京勉強会 #38
そんなわけで
わんくま同盟 東京勉強会 #38
作りました
わんくま同盟 東京勉強会 #38
• public delegate void ActionRef1<TRef>(ref TRef argRef1);• public delegate void ActionRef1<T, TRef>
(T arg1, ref TRef argRef1);( 省略 ) (省略 ) (省略 ) (省略 ) (省略 ) (省略 ) (省略 ) (省略 )
• public delegate void ActionRef4<TRef1, TRef2, TRef3, TRef4>(ref TRef1 argRef1, ref TRef2 argRef2, ref TRef3 argRef3, ref TRef4 argRef4);
( 省略 ) (省略 ) (省略 ) (省略 ) (省略 ) (省略 ) (省略 ) (省略 )
• public delegate TReturn FuncOut4<TOut1, TOut2, TOut3, TOut4, TReturn>(out TOut1 argOut1, out TOut2 argOut2, out TOut3 argOut3, out TOut4 argOut4);
( 省略 ) (省略 ) (省略 ) (省略 ) (省略 ) (省略 ) (省略 ) (省略 )
• public delegate TReturn FuncOut8<TOut1, TOut2, TOut3, TOut4, TOut5, TOut6, TOut7, TOut8, TReturn>( out TOut1 argOut1, out TOut2 argOut2, out TOut3 argOut3, out TOut4 argOut4, out TOut5 argOut5, out TOut6 argOut6, out TOut7 argOut7, out TOut8 argOut8);
Generated by ConsoleApplication31.exe (144 デリゲート型 )
わんくま同盟 東京勉強会 #38
多値返却 ( もどき ) 構想• モデルケース :bool int.Parse(string, out int value)
• bool(string, out int) をTuple<bool, int>(string) にすればでき
る!
• Tuple は .NET FX 4.0 で正式に導入されます– 実装は簡単なのでちょいと作るなり外から持ってくる
なり
• そんな感じで、作ってみました
わんくま同盟 東京勉強会 #38
• public delegate TReturn FuncOut1<T, TOut, TReturn> (T arg1, out TOut argOut1);
• public struct Tuple<T1, T2> { public T1 Item1; public T2 Item2; public Tuple(T1 item1, T2 item2) { Item1 = item1; Item2 = item2; }}
• public static class Extension { public static Tuple<TReturn, TOut> InvokeMulti <T, TOut, TReturn> (this FuncOut1<T, TOut, TReturn> func, T arg) { TOut value; return new Tuple<TReturn, TOut> (func(arg, out value), value); }}
わんくま同盟 東京勉強会 #38
実行してみ
る
わんくま同盟 東京勉強会 #38
Powered by LINQPad<http://www.linqpad.net/>
わんくま同盟 東京勉強会 #38
ちょっと不恰好だけど
多値返却できた!
わんくま同盟 東京勉強会 #38
ご清聴ありがとう
ございました