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
을 그것은 작동하지만 왜 :(
'데프 self.add' 정의하는 요구하지 않습니다 및이 오류와 함께, 나는 누군가가 다음 명령을 사용하고 시도하는 forum에서 발견 "클래스"(싱글 톤) 메소드. 'puts Test2.add (2,3)'와 함께 사용할 수 있습니다. 또는 정의에서'self '를 제거하고 그것을't = Test2.new;의 인스턴스 메소드로 사용할 수 있습니다. t.add (2,3)'를 넣습니다. – BernardK
@BernardK 나는 두 가지 방법을 시도해 보았는데 각각 동일한 오류가 발생했습니다. – danynl