今日はこのイベントに参加してます。
Okayama.rb #22 – Okayama.rb
http://www.circleaf.com/events/49
集まってRubyに関する何かをしましょう
2013年10月31日(木) 19:00 〜 21:30
今日の話題は、僕の中では、中2ノートと空想都市の中村市の件。
空想都市へ行こう! / 地理人が、空想都市を詳細地図で描く。
http://imgcity.chirijin.com/
地図だけでなく、企業ロゴまで。そして、地図には上書きされ続ける歴史がある。
場所だけでなく、歴史があり、心がある。それが中村市。
管理人はこんな人。
地理人 (今和泉 隆行)
1985年鹿児島市生まれ。生後すぐに横浜市に移る。バスからの車窓観察が好きで、よく1万分の1道路地図やバスの路線図を見ていた。見ているだけでは済まなくなり、7歳のときに自分で道路地図やバスの路線図を描き始めた。中学校になっても、高校になっても描き続け、それはやがて”現実的な”現実逃避の舞台となってくる。大学2年で一旦中断したが、25歳になってから地図作りを再開。20歳前後の私が描ききれなかったリアリティを再度追求している。
管理人の中村市のおススメスポットに対する回答が素晴らしい。
ぜひ、リンク先から身に行ってほしい。
クリエイティブ魂の塊といった感じだ。
設楽陸 WEB 『現代アート・架空の歴史ノート・架空の漫画ノート』
http://wwwbakudanrobocom.blogspot.jp/
アマゾンで中二病全開な落書きノート「架空の歴史ノート-1 帝国史 分裂大戦編」
Rubyのmethod_missingメソッドの動きに感動した。
定義していないメソッドが呼ばれたときの動作を記述できるという点。
それを利用して、定義していないメソッドが呼ばれたときに
メソッド名のルールに従って適切なメソッドを呼び出して実行結果を返す。
Javaのリフレクションを使えば、Rubyのmethod_missingメソッドなことできるかなと。
リフレクションの参考サイト
Javaリフレクションメモ(Hishidama’s Java Reflection Memo)
http://www.ne.jp/asahi/hishidama/home/tech/java/reflection.html
自分のクラスのメソッドがあればそれを呼び出して実行結果を返す。
自分のクラスのメソッドがなければ、メソッド名のルールに従ってメソッドを呼び出して実行結果を返す。
もっとまじめに作れば面白いものが作れそうな気がする。
MissingMethod.java
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
public class MissingMethod {
/**
* テスト用
*
* @param args
*/
public static void main(String[] args) {
MissingMethod mm = new MissingMethod();
System.out.println(mm.execute("one"));
System.out.println(mm.execute("test1"));
System.out.println(mm.execute("test2"));
System.out.println(mm.execute("hoge"));
}
/**
* 存在しないメソッドの場合は適当にメソッドを作成してくれる
*
* @param methodName メソッド名
* @return 戻り値
* @throws InvocationTargetException
* @throws IllegalAccessException
* @throws IllegalArgumentException
*/
public Object execute(String methodName) {
Object obj = null;
Method method;
try {
method = this.getClass().getMethod(methodName, null);
obj = method.invoke(this, null);
} catch (SecurityException e1) {
return "SecurityException:" + methodName;
} catch (NoSuchMethodException e1) {
MethodCreate mc = new MethodCreate();
obj = mc.execute(methodName);
} catch (IllegalArgumentException e) {
return "IllegalArgumentException:" + methodName;
} catch (IllegalAccessException e) {
return "IllegalAccessException:" + methodName;
} catch (InvocationTargetException e) {
return "InvocationTargetException:" + methodName;
}
return obj;
}
/**
* "one"出力
*
* @return
*/
public Object one() {
return "one";
}
}
MethodCreatable.java
/**
* 自動メソッド作成インタフェース
* @author arimura
*
*/
public interface MethodCreatable {
public Object execute(String methodName);
}
MethodCreate.java
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
/**
* メソッドを作成するクラス
* MethodCreatableインタフェースを実装する。
*/
public class MethodCreate implements MethodCreatable {
/**
* 実行クラス
*/
@Override
public Object execute(String methodName) {
Object obj = null;
try {
Method method = this.getClass().getMethod(methodName, null);
return method.invoke(this, null);
} catch (SecurityException e) {
return null;
} catch (NoSuchMethodException e) {
return "NoSuchMethodException:" + methodName;
} catch (IllegalArgumentException e) {
return "IllegalArgumentException:" + methodName;
} catch (IllegalAccessException e) {
return "IllegalAccessException:" + methodName;
} catch (InvocationTargetException e) {
return "InvocationTargetException:" + methodName;
}
}
/**
* MethodCreateメソッド1
*
* @return test1を返す
*/
public Object test1() {
Object obj = null;
obj = "test1";
return obj;
}
/**
* MethodCreateメソッド2
*
* @return test2を返す
*/
public Object test2() {
Object obj = null;
obj = "test2";
return obj;
}
}
実行例
one
test1
test2
NoSuchMethodException:hoge

コメントを残す