2011-02-04 39 views
5

Tôi đang sử dụng Apache commons cli (1.2) để phân tích cú pháp dòng lệnh.Lỗi biên dịch Scala OptionBuilder

Tôi có sau trong mã của tôi:

import org.apache.commons.cli.OptionBuilder 
OptionBuilder.withLongOpt("db-host").hasArg. 
withDescription("Name of the database host").create('h') 

tôi nhận được lỗi hasArg is not a member of org.apache.commons.cli.OptionBuilder. Nó không có sự khác biệt nếu tôi thay đổi .hasArg thành .hasArg().

Tại sao?

BTW, Java phân tích cú pháp này.

+0

(Nhắc nhở: Bật cảnh báo trong javac/Eclipse/bất cứ nơi nào.) –

+0

@pst: Tôi có chúng trên. Tôi đang làm việc trong Netbeans (hỗ trợ Scala tốt nhất, IMHO) và nó nhấn mạnh phương thức 'hasArg'. Tôi thích làm việc trong IntelliJ, nhưng plugin Scala có một số lỗi nghiêm trọng với mã định dạng lại. Tôi đã gửi báo cáo lỗi, nhưng cho đến nay, chưa có bản sửa lỗi nào được đăng. – Ralph

Trả lời

12
import org.apache.commons.cli.OptionBuilder 
OptionBuilder.withLongOpt("db-host").hasArg. 
withDescription("Name of the database host").create('h') 

tôi nhận được lỗi hasArg is not a member of org.apache.commons.cli.OptionBuilder. Nó không có sự khác biệt nếu tôi thay đổi .hasArg thành .hasArg().

Tại sao?

không có phương pháp dụ hasArg trong OptionBuilder, chỉ có một phương pháp tĩnh. Vì hasArg là một phương thức tĩnh, bạn rõ ràng cần phải gọi nó trên lớp, không phải trên một thể hiện của lớp.

BTW, Java phân tích cú pháp này.

Tôi không hiểu điều này có liên quan gì đến việc phân tích cú pháp. Scala phân tích cú pháp này cũng tốt. Ngoài ra, những gì một số chương trình hoàn toàn khác nhau không hoặc không làm với mã này là hoàn toàn không liên quan, vì đây là mã Scala, không phải một số ngôn ngữ khác.

Bạn cần phải làm một cái gì đó như thế này:

import org.apache.commons.cli.OptionBuilder 

OptionBuilder.withLongOpt("db-host") 
OptionBuilder.hasArg 
OptionBuilder.withDescription("Name of the database host") 

val optionParser = OptionBuilder.create('h') 
+6

Ergh, OptionBuilder này có giao diện khủng khiếp! – pedrofurla

+4

@pedrofurla: Nó vô tình hoạt động trong Java, bởi vì trong Java, các phương thức tĩnh có thể được gọi trên một cá thể, và nếu không có phương thức instance tương ứng, thay vì ném một lỗi, hệ thống sẽ âm thầm chuyển nó thành một lời gọi phương thức tĩnh bạn. Vì vậy, trong Java, nó * trông giống như * một giao diện thông thạo bằng cách sử dụng phương pháp Chaining, trong khi trên thực tế, nó không phải là. Cách thích hợp để làm điều này, có lẽ sẽ là sử dụng một đối tượng trung gian trạng thái để nắm bắt các cuộc gọi phương thức, thậm chí có thể là một loại Máy trạng thái kiểu. –

+1

Từ quan trọng trong bình luận của tôi ở trên tất nhiên là "vô tình". Như @pst gợi ý ở trên, điều này * sẽ * tạo ra một cảnh báo nghiêm khắc trong bất kỳ Java IDE và/hoặc trình soạn thảo nào, và hầu hết các trình kiểm tra kiểu (CheckStyle, PMD, ...) sẽ từ chối nó. –

Các vấn đề liên quan