2012-10-20 51 views
0

我收到此錯誤:爲什麼opennlp庫的HelloWorld在Java上工作正常,但不適用於Jruby?

SyntaxError: hello.rb:13: syntax error, unexpected tIDENTIFIER 
public HelloWorld(InputStream data) throws IOException { 

的HelloWorld.rb是:運行ruby HelloWorld.rb "I am trying to make it work"

當我運行它完美的作品,當然HelloWorld.java "I am trying to make it work"

require "java" 

import java.io.FileInputStream; 
import java.io.InputStream; 
import java.io.IOException; 

import opennlp.tools.postag.POSModel; 
import opennlp.tools.postag.POSTaggerME; 

public class HelloWorld { 
    private POSModel model; 

    public HelloWorld(InputStream data) throws IOException { 
    setModel(new POSModel(data)); 
    } 

    public void run(String sentence) { 
    POSTaggerME tagger = new POSTaggerME(getModel()); 
    String[] words = sentence.split("\\s+"); 
    String[] tags = tagger.tag(words); 
    double[] probs = tagger.probs(); 

    for(int i = 0; i < tags.length; i++) { 
    System.out.println(words[i] + " => " + tags[i] + " @ " + probs[i]); 
    } 
    } 

    private void setModel(POSModel model) { 
    this.model = model; 
    } 

    private POSModel getModel() { 
    return this.model; 
    } 

    public static void main(String args[]) throws IOException { 
    if(args.length < 2) { 
    System.out.println("HelloWord <file> \"sentence to tag\""); 
    return; 
    } 

    InputStream is = new FileInputStream(args[0]); 
    HelloWorld hw = new HelloWorld(is); 
    is.close(); 

    hw.run(args[1]); 
    } 
} 

.java沒有按」 t包含require java聲明。

編輯:

我跟着以下steps

輸出爲jruby -v

jruby 1.6.7.2 (ruby-1.8.7-p357) (2012-05-01 26e08ba) (Java HotSpot(TM) 64-Bit Server VM 1.6.0_35) [darwin-x86_64-java] 

回答

1

JRuby是Java中的一個ruby實現,這意味着如果你想使用JRuby,你必須使用ruby語法。您確實可以在JRuby中使用Java對象,但使用ruby語法 - 您只能使用Java語法。

例如,frame = javax.swing.JFrame.new("Window")使用JFrame,但使用紅寶石語法(即JFrame.new而不是new JFrame)。

所以您的代碼將是這樣的:

require 'java' 
# Require opennlp jars 
Dir.glob('**/*.jar').each do |jar| 
    require jar 
end 

java_import 'opennlp.tools.postag.POSTaggerME' 
java_import 'opennlp.tools.postag.POSModel' 

class HelloWorld 
    def initialize(data) 
    @model = POSModel.new(data) 
    end 

    def run(sentence) 
    tagger = POSTaggerME.new(@model) 
    words = sentence.split 
    tags = tagger.tag(words) 
    probs = tagger.probs 

    probs.each_with_index do |p,i| 
     puts "#{words[i]} => #{tags[i]} @ #{p}" 
    end 
    end 
end 

stream = File.new(ARGV[0]).to_java.getInStream 
HelloWorld.new(stream).run(ARGV[1]) 

所有。紅寶石。碼。

1

由於它是用Java編寫的,而不是紅寶石?

+0

https://github.com/jruby/jruby/wiki/CallingJavaFromJRuby FYI – 0x90

+1

如果您要編寫Java並在JVM上運行它,只需使用java。 –

+0

'require'java' #通過上面的'require',我們現在可以通過它們的完整路徑參考標準Java平臺的一部分。我們可以在Java對象上透明地調用Java方法,就像在Java對象上調用Java方法一樣,如果它們是在Ruby中定義的。 frame.getContentPane.add(標籤)#調用Java方法 '的getContentPane' 那偉大工程...... frame.setDefaultCloseOperation(javax.swing.JFrame中:: EXIT_ON_CLOSE) frame.pack frame.setVisible(真)' – 0x90

相關問題