日記帳だ! with Tux on Libserver

二度目の大改造!! 日記帳…か?を継承し、より柔軟でパワフルなBlogに変身しました。

RSSに対応しています。リンク・コメント・トラックバックは自由にしていただいてほぼ問題ありません。
RSS購読方法、僕のリンク・コメント・トラックバックについての考えを読むことをおすすめします。

JavaScriptを有効にし、Cookieを受け入れ、以下のブラウザを使うことで完全なコンテンツが楽しめます。
Mozilla Firefox 3.0(Get Firefox)・Opera 9.6・Safari 3.2・Lunascape 4/5(Gecko)・Lunascape 5(WebKit)
Internet Explorer 7/8とそれを使うIEコンポーネントブラウザ(Lunascape・Sleipnirなど)

時に型変換演算子が恋しくなることもあろう

明日、試験なのよねー。
IPAの情報処理技術者試験のうち、基本情報技術者試験を受けようと思って、
申し込んでついに明日と。
まぁ勉強はしてきたけど、SQLがなぁ…ぼちぼちですね。
SELECT TABLE1.COL1,TABLE1.COL2,TABLE2.COL2 FROM TABLE1,TABLE2 WHICH TABLE1.COL1=TABLE2.COL1
別にこのSQL文自体はあまり意味はないのだが、
データベースには選択(select)、結合(join)、投影(projection)がありますと。
さて、いくつかの列を選択して表示することなんだ。答えは投影。
けどSQL文見ると、FROMで結合するのを選んで、WHICHで選択する条件を選んで、SELECTで投影するのを選ぶと。
そんな感じがするのですが、どうもそうらしいです。
いろいろやってたのだが、IronPythonでこういうことをやるのは難しいみたい。
string str="The quick brown fox jumps over the lazy dog";
char[] chars=str.ToCharArray();
Array.Reverse(chars);
str=new string(chars);
Console.WriteLine(str);
実は.NET Frameworkでは文字列を反転させるというのはないんですね。
それで一旦char[]に変換した後、それをstringのコンストラクタでstring型にすると。
たまにはこういう遊びもいいねというわけでIronPythonで同じことをやってみようとした…
mystr='The quick brown fox jumps over the lazy dog'
chars=mystr.ToCharArray()
System.Array.Reverse(chars)
mystr=System.String(chars)
print mystr
すると返ってきた値が非常にひどい。
System.Char[](<System.Char object at 0x000000000000002F [g]>, <System.Char object at 0x0000000000000030 [o]>,...
ちなみにSystem.Console.WriteLine(chars)とするときちんと表示される。
これはWriteLineがchar[]を文字列的に解釈する機能があるから。
調べると、System.StringはPythonのstrと同様に取り扱われると。
で、基本的にはPythonのstrの機能も、.NET FrameworkのSystem.Stringの機能もどっちも持ってる。
Python式にlen(str)としても、.NET式にstr.Lengthとしても同じように結果が返ってくる。
ところがコンストラクタばかりはこうもいかない。
それについてはPythonのstrのコンストラクタを優先してる。
これなのだが、str(a)は.NETで言う a.ToString() に近い。
charsをPython式に文字列に変換したものがこのとんでもない文字列だと。
しかしこれってどうすりゃいいんだ?
まぁchar[]からstringを構成するなら、System.Text.StringBuilderを使えばよさそうなもんだ。
sb=System.Text.StringBuilder()
sb.Append(chars)
mystr=sb.ToString()
ついでに言うと、Appendメソッドの返り値はそのインスタンスだから、1行で、
mystr=System.Text.StringBuilder().Append(chars).ToString()
と書いても動く。まぁ下品だけどね。
これでめでたしめでたしというのも1つの答え。
ところで前から気になってたことがあって、
IronPythonにはC#で言うtypeof演算子相当のものはないと。
それはそうなんだが、こういうのが通るのは変だなと思った。
arr=System.Array.CreateInstance(System.Int32,100)
ここで、CreateInstanceの第一引数はSystem.Type型なのよね。
C#ならこれを使うことはほとんどないだろうが、もし使うなら、typeof(System.Int32)と書かないとだめ。
それで、型を表すのは実はTypeのインスタンスだと。
実はPythonでは、型名を代入、例えばc=System.Consoleとすると、c.WriteLine()とか使える。
そうそう、strとかいう変数名の変数作っちゃ痛い目にあうからやめようね。
これをIronPythonではTypeのインスタンスでやってると思ったのだがどうも違うみたい。
ただ、Type型の引数を要求するときは、自動的に変換してくれると。
同じようなことってありますよね。タプルが配列に変換されるとか。
ss='The quick brown fox jumps over the lazy dog'.Split(('o',' '))
ただ、こちらは自分で.NETの配列を作りたければ、
System.Array[System.Char](('o',' '))とかすればよかったけどね。
まぁタプルは読み取り専用で、配列に変換されて値が変わったとしても、元のタプルは変わらんから、
あらかじめ配列に変換しておくことが必須だけど。
このType型の引数はType型に変換してから渡すという性質を使って、C#でこんなDLLを作ってみた。
namespace hidemaro {
public static class ironplus {
public static Type CType(Type t) { return t; }
public static string CStr(char[] cs) { return new string(cs); }
}
}
まぁこれをクラスライブラリとしてコンパイルして、clr.AddReferenceToFileで参照設定に追加して、
from hidemaro.ironplus import *で全部インポート。
これで、System.Type型のインスタンスを用意できないことと、
char[]からSystem.String作るのめんどくさいが解決できる。
utf8=CType(System.Text.Encoding).GetProperty('UTF8').GetValue(None,None)
chars='The quick brown fox jumps over the lazy dog' .ToCharArray()
System.Array.Reverse(chars)
print CStr(chars)
CTypeを使ったのは、昨日言ってた.NETのリフレクションで静的プロパティを読み取る件。
ちなみに、インスタンスのTypeはGetTypeメソッドで知れます。
しかしこの2つはちょっとミスのような気がするなぁ…
あといくつかSystem.Stringにはコンストラクタあるが、IronPythonで使えるのはあと2つだけ。
1つはchar[]の一部だけをStringに変換すること。
これについてはPythonのスライスで配列の一部を切り出した配列をCStrなどにかければOK。
もう1つは1つのcharを何度か繰り返した文字列を作るもの。
文字列に対する*演算子は文字列の繰り返しなので、これを使えばいける?
sliced=CStr(chars[4:8]) #new string(chars,4,4)
c=chars[10]
repeated=str(c)*10 #new string(c,10)
まぁこんな具合です。
どうでもいいことかもしれないが、Perlとかやってるとやたらシングルクオートをよく使う。
ダブルクオートだと変数展開と\nなどの展開があるから、
それがないならシングルクオートの方が動作が速いし予想外の動きをしないと。
$a='$k\n$k';
print "foo$a\n$a"
結果はfoo$k\n$k(改行)$k\n$kですね。同様のことはPHP・Rubyでも言えると。
ただ、Pythonでは変数展開とかないし、\nとかは常に展開されるみたい。
なので、シングルクオートもダブルクオートも意味は同じと。
けどPerlでシングルクオートをよく使うもんだから、シングルクオートだらけ。
Cとか見てる人からすれば変な話だとは思うけど、そういうクセです。
もちろんダブルクオートでしか文字列を表せないやつではシングルクオートで文字列書いたりしないよ。
Author : hidemaro
Date : 2008/10/18(Sat) 22:26
Windows・Microsoft | Comment | trackback (0)

Tools