Create  Edit  Diff  FrontPage  Index  Search  Changes  Login

The Backyard - InvokingMethodWithoutTypeSignature Diff

  • Added parts are displayed like this.
  • Deleted parts are displayed like this.

!以下の条件で判断する(rjb-0.1.2rjb-0.1.4以降)

*引数の数が一致
*型がjava.lang.Objectであれば無条件に許容
*FIXNUMであれば、BCDFIJSのいずれかに一致(範囲チェック無し)
*STRINGであれば、java.lang.Stringに一致
*TRUE/FALSEであれば、Zに一致
*ARRAYであれば、配列であれば一致(型チェック無し)
*Rjbの移入オブジェクトのインスタンスであれば、java.lang.Stringに一致または、移入元クラスがJava側のクラスまたはその派生クラスであれば一致。
**Stringに一致した場合は、toStringを呼び出して文字列を与える。本来のJavaの動作とは異なるがスクリプトの簡便さからJavaの文字列連結などと同様な処置を行う。この判定はメソッドの並び順に依存し、継承の近さとは関係しないという制限を持つ。

*それ以外でJava側がクラス型であれば一致。プリミティブ型であれば不一致。

!元の論議

*newしたときにオーバーロードされていても判断しきれていない場合がある。エラーを吐くべきだがStringとプリミティブ型は難しくない場合は自動認識して欲しい。(javax.swing.JButtonをnew("ぼたん")としたらどうもIconのインスタンスだと思われたようだ。==バイト列だから?==)
**下の例外はコンストラクタとは関係ないようですが、できれば元のスクリプトが欲しいです。って言うか、いきなりJButtonをimportしたらいきなりSEGVするなぁ(実はJavaのGUIプログラミングは苦手というか良く知らなくてIDE任せだったり)。ちなみに自動認識はある程度まではしています。最初に一致したシグネチャーを使うという方法ですが。L'eclatのほうに書いている、Win32とMacで並び順が違ってテストでエラーっていうパターンはその類。
***rjb.c(rjb_newinstance:2071)でif ((*pc)->arg_count == argc)してて、最初に一致するコンストラクタがnew JButton(java.awt.Icon)だからエラーが出たのだと思う。引数からシグネチャを生成すればいいんだろうけどいい案は無い。以下スクリプトそのもの。サイズがおかしいが、適当にJForm::setSize()してpack()すればよい。そしてisVisible()を監視するのは邪道気味。Javaの文字列はUnicodeなのでフックしないと文字化けしちゃうなあ。うーんなんでiconv動かんのじゃ〜。
***なんだ、ばれてますね(一致=引数の数であって型じゃない)。型見るの面倒だけど文字列くらいは見るようにしましょう。

require 'rjb'

Rjb::load

frame = Rjb::import('javax.swing.JFrame')
box_layout = Rjb::import('javax.swing.BoxLayout')
border_layout = Rjb::import('java.awt.BorderLayout')
grid_layout = Rjb::import('java.awt.GridLayout')
button = Rjb::import('javax.swing.JButton')


f = frame.new
#f.getContentPane().setLayout(grid_layout.new)
f.getContentPane().setLayout(border_layout.new)

#b = button.new_with_sig("Ljava.lang.String;", "ぼたん") #動く
b = button.new("ぼたん") #変


#f.getContentPane().add(b)
f.getContentPane()._invoke('add', 'Ljava.awt.Component;', b)

f.setVisible(true)
loop do
break unless f.isVisible()
sleep(0.1)
end