たけ(tk)と申します。

2 views
Skip to first unread message

take_tk

unread,
Oct 16, 2008, 11:58:09 PM10/16/08
to rub...@googlegroups.com
始めまして、たけ(tk)と申します。先日、三鷹の飲み屋で最首さんの独演会を聞
いた者です。

さっそくなんですが、

http://code.google.com/p/rubeus/source/browse/trunk/lib/rubeus/component_loader.rb?r=96

def build_class_to_package_table(java_package)
・・
@class_to_package[class_name] = @class_to_package.key?(class_name) ?
[@class_to_package[class_name], package] : package
end
end

の部分は、同じ名前のクラスが3個以上あると、おそらく意図せざる結果を返す
と思われます。

@classlist =<<MMMM
java/lang1/One
java/lang1/Two
java/lang2/Two
java/lang1/Three
java/lang2/Three
java/lang3/Three
MMMM
def class_names
classes = []
@classlist.each do |line|
classes << line.gsub(/\//, '.').strip
end
classes
end
def build_class_to_package_table(java_package)
@class_to_package = {}
class_names.each do |fqn|
parts = fqn.split('.')
class_name = parts.pop
next if class_name.include?('$')
package = parts.join('.')

@class_to_package[class_name] = @class_to_package.key?(class_name) ?
[@class_to_package[class_name], package] : package
end
end

のとき

{"Two"=>["java.lang1", "java.lang2"], "One"=>"java.lang1", "Three"=>[["java.lang1", "java.lang2"], "java.lang3"]}

となります。(Three の値が二重配列になる)。

{"Two"=>["java.lang1", "java.lang2"], "One"=>"java.lang1", "Three"=>["java.lang1", "java.lang2", "java.lang3"]}

というようなフラットな配列を期待しているなら、

def build_class_to_package_table(java_package)
・・
#@class_to_package[class_name] = @class_to_package.key?(class_name) ?
# [@class_to_package[class_name], package] : package
# ↓
case @class_to_package[class_name]
when nil ; @class_to_package[class_name] = package
when String ; @class_to_package[class_name] = [@class_to_package[class_name], package]
when Array ; @class_to_package[class_name] << package
else ; raise
end
end
end

でしょう。また、もし、一つでも配列に入るということでもよければ、

{"Two"=>["java.lang1", "java.lang2"], "One"=>["java.lang1"], "Three"=>["java.lang1", "java.lang2", "java.lang3"]}

def build_class_to_package_table(java_package)
## @class_to_package = {}
@class_to_package = Hash.new{[]} # ← ★ 存在しないときのデフォルト値
class_names.each do |fqn|
parts = fqn.split('.')
class_name = parts.pop
next if class_name.include?('$')
package = parts.join('.')

@class_to_package[class_name] <<= package # ← ★ 「<<」の自己代入
end
end

なんていう方法もあります。

Take_tk = KUMAGAI Hidetake
たけ(tk)=熊谷秀武

Takeshi Akima

unread,
Oct 17, 2008, 12:15:29 AM10/17/08
to rub...@googlegroups.com
たけさん

はじめまして。秋間と申します。

参考になるご意見ありがとうございます。
Rubeusでは基本的に一つのComponentLoaderが重複したクラス名を
扱わないようにかんがえていますが、二重配列になっている点は気付いて
ませんでした。助かります。

別のパッケージで重複したクラス名になっているものを一つの
ComponentLoaderで扱う方法としては、別名でも付けられる様に
しようかなと思っております。

何かお気づきの点がありましたらご指摘ください。宜しくお願い致します。


take_tk さんは書きました:

Reply all
Reply to author
Forward
0 new messages