私はJRubyを5年間使っておらず、奇妙なことを発見しています。私はコンパイル
class Test2
def self.addc(num1, num2)
num1 + num2
end
def self.xyz
puts 'xyz'
end
def addi(num1, num2)
num1 + num2
end
end
puts Test2.addc(4,6)
t = Test2.new
puts t.addi(2, 3)
は:ファイルTest2.rb
考える
$ jrubyc Test2.rb
$ jruby -J-cp .:/Users/b/.rvm/rubies/jruby-9.0.5.0/lib/jruby.jar use_t.rb
in use_t.rb
NoMethodError: undefined method `addc' for Java::Default::Test2:Class
は、その後、私はJRubyのを使用して読ま(達人プログラマが、使用できなくなりますから):
If you pass the --java option to jrubyc, it will generate a .java file instead of a .class file. You can then fall back on familiar Java tools to finish the job.
$ jrubyc --java Test2.rb
$ javac -cp .:/Users/b/.rvm/rubies/jruby-9.0.5.0/lib/jruby.jar Test2.java
Test2.java:16: error: unclosed string literal
String source = new StringBuilder("class Test2
^
Test2.java:17: error: illegal character: '\'
\n" +
^
私はTest2.java
を開き、参照:
public class Test2 extends RubyObject {
private static final Ruby __ruby__ = Ruby.getGlobalRuntime();
private static final RubyClass __metaclass__;
static {
String source = new StringBuilder("class Test2
\n" +
" def self.addc(num1, num2)
\n" +
" num1 + num2
\n" +
" end
\n" +
...
私はそうのように "修復" するには、このファイルを編集します:
require 'java'
#$CLASSPATH << '.'
java_import 'Test2'
puts "in #{__FILE__}"
Test2.xyz
puts ::Test2.addc(8,9)
t = ::Test2.new
puts t.addi(2,3)
を実行します:次に、ファイルuse_t.rb
で、
$ javac -cp .:/Users/b/.rvm/rubies/jruby-9.0.5.0/lib/jruby.jar Test2.java
を再コンパイルし、
static {
String source = new StringBuilder("class Test2\n" +
" def self.addc(num1, num2)\n" +
" num1 + num2\n" +
" end\n" +
" \n" +
" def self.xyz\n" +
" puts 'xyz'\n" +
" end\n" +
"\n" +
...
を
$ jruby -J-cp .:/Users/b/.rvm/rubies/jruby-9.0.5.0/lib/jruby.jar use_t.rb
10
5
uri:classloader:/jruby/java/core_ext/object.rb:93: warning: already initialized constant Test2
in use_t.rb
xyz
17
5
これは機能します。不思議な迂回路。
それが原因xyz
だけで、強制変換パラメータの問題ではない:再び
$ rvm install jruby
...
jruby-9.1.7.0 - #configure
jruby-9.1.7.0 - #download
...
jruby-9.1.7.0 - #generating default wrappers........
$ rvm use jruby
Using /Users/b/.rvm/gems/jruby-9.1.7.0
コンパイル:
NoMethodError: undefined method `xyz' for Java::Default::Test2:Class
それから私は別のバージョンを試してみてください
$ jrubyc Test2.rb
TypeError: failed to coerce org.objectweb.asm.ClassWriter to org.jruby.org.objectweb.asm.ClassVisitor
block in compile_files_with_options at /Users/b/.rvm/rubies/jruby-9.1.7.0/lib/ruby/stdlib/jruby/compiler.rb:189
その後、私はダウンロードしてください最新リリース(jruby-complete-9.1.15.0.jar
)からjruby.orgそれは作品
$ java -cp .:/userdata/Sources/jruby-complete-9.1.15.0.jar org.jruby.Main ./use_t.rb
10
5
uri:classloader:/jruby/java/core_ext/object.rb:95: warning: already initialized constant Test2
in ./use_t.rb
xyz
17
5
が、なぜ:(
'defのself.add'定義Aを聞かない:と、このエラーで、私は誰かが、次のコマンドを使用して、それを試すことforumで見つけます"クラス"(シングルトン)メソッド。 'puts Test2.add(2,3)'と一緒に使うことができます。あるいは、定義で 'self'を削除し、' t = Test2.new;でインスタンスメソッドとして使用できます。 puts t.add(2,3) '。 – BernardK
@BernardK私は両方のメソッドを試しましたが、それぞれ同じエラーが発生しました。 – danynl