จะจับข้อโต้แย้งที่ส่งไปยังสคริปต์ Groovy ได้อย่างไร

ฉันเพิ่งเริ่มต้นด้วย Groovy ฉันไม่พบตัวอย่างวิธีจัดการกับข้อโต้แย้งของสคริปต์ Groovy เลย ดังนั้นฉันจึงแฮ็กวิธีนี้ด้วยตัวเอง จะต้องมีวิธีที่ดีกว่าในการทำเช่นนี้? ถ้าเป็นเช่นนั้น ฉันกำลังมองหาวิธีที่ดีกว่านี้ เนื่องจากฉันอาจจะมองข้ามสิ่งที่ชัดเจนไป

import groovy.lang.Binding;
Binding binding = new Binding();
int x = 1
for (a in this.args) {
  println("arg$x: " + a)
  binding.setProperty("arg$x", a);
  x=x+1
}
println binding.getProperty("arg1")
println binding.getProperty("arg2")
println binding.getProperty("arg3")

person djangofan    schedule 16.06.2011    source แหล่งที่มา


คำตอบ (6)


หากคุณต้องการแยกวิเคราะห์ขั้นสูงมากกว่าแค่รับอาร์กิวเมนต์ คุณสามารถใช้ Groovy CliBuilder เพื่อช่วยคุณได้ ช่วยคุณในเรื่องแฟล็กบรรทัดคำสั่ง อาร์กิวเมนต์เสริม และการพิมพ์คำแนะนำการใช้งาน

ชำระเงิน Javadoc ของ CliBuilder หรือ MrHakis โพสต์เกี่ยวกับเรื่องนี้

person xlson    schedule 17.06.2011

ขออภัยที่ถามคำถาม. ฉันเพิ่งคิดออก:

println args[0]
println args[1]
println args[2]
person djangofan    schedule 16.06.2011
comment
ทำงานได้อย่างสมบูรณ์แบบ ฉันไม่รู้เกี่ยวกับเรื่องนั้น นี่คือหน้าที่ดีที่แสดงรายการความสามารถที่เกี่ยวข้องกับสคริปต์ Groovy ทั้งหมด (รวมถึงตัวแปร args) - groovy.codehaus.org/ Groovy+CLI - person Michal Bernhard; 25.09.2014
comment
@MichalBernhard นี่คือสำเนา: https://web.archive.org/web/20150317165438/http://groovy.codehaus.org/Groovy+CLI - person pennstatephil; 04.03.2016

วิธีที่ง่ายที่สุดคือใช้ this.args เป็นอาร์เรย์เช่น:

test.groovy

println this.args[0]

เรียก:

C:>groovy test this

เอาท์พุท:

this
person paulkav1    schedule 01.04.2015

ลองสิ่งนี้:

args.each{println it}
person Zak    schedule 08.08.2016

มันคล้ายกับ Java มาก และคุณสามารถใช้ไวยากรณ์ Java เดียวกันได้ สำหรับเช่น

class TestExecutor {

    public static void main(def args) {
        println("Printing arguments");
        for(String arguments : args) {
            println (arguments);
        }
    }

} 

เรียกใช้แล้วคุณจะเห็นข้อโต้แย้งที่พิมพ์ออกมา

C:\Users\athakur\Desktop>groovy TestExecutor.groovy test1 test2 test3
Aug 16, 2014 11:47:56 AM org.codehaus.groovy.runtime.m12n.MetaInfExtensionModule
 newModule
WARNING: Module [groovy-nio] - Unable to load extension class [org.codehaus.groo
vy.runtime.NioGroovyMethods]
Printing arguments
test1
test2
test3

โปรดทราบด้วยว่าหากคุณไม่ได้ระบุวิธีการหลักหรือระบุวิธีที่คล้ายกันในตัวอย่างด้านบน คุณจะได้รับอาร์กิวเมนต์เป็น args[i] แต่คุณสามารถเปลี่ยนชื่อของอาร์เรย์ได้ (เหมือนกับ java อีกครั้ง) ดังนั้นคุณสามารถมีบางอย่างเช่น-

public static void main(def argsNew) {
    println("Printing arguments");
    for(String arguments : argsNew) {
        //using args in above for loop will throw error
        println (arguments);
    }
}

ชี้ให้เห็นว่าไม่ใช่สิ่งที่ฮาร์ดโค้ด สุดท้ายตามที่แนะนำในคำตอบอื่น คุณสามารถใช้ CliBuilder เพื่อการแยกวิเคราะห์แบบอัจฉริยะได้เสมอ แต่อีกครั้งในเรื่องนั้นมันก็ใช้ภายใน def options = cli.parse(args) เช่นกัน

person Aniket Thakur    schedule 16.08.2014
comment
//การใช้ args ในด้านบนเพื่อวนซ้ำจะทำให้เกิดข้อผิดพลาด - args อะไร? - person Blessed Geek; 29.07.2015
comment
หากคุณไม่ได้ระบุเมธอดหลักหรือระบุวิธีการเหมือนในตัวอย่างข้างต้น... แต่คุณเปลี่ยนชื่ออาร์เรย์ได้ - ไม่เข้าใจ - person Blessed Geek; 29.07.2015
comment
@BlessedGeek นั่นหมายความว่าหากคุณไม่ได้ระบุวิธีการหลักหรือระบุชื่ออาร์เรย์ในอาร์กิวเมนต์เป็น args คุณสามารถเข้าถึงอาร์กิวเมนต์ที่ส่งด้วย args[i] แต่ถ้าคุณเปลี่ยนชื่ออาร์เรย์ในอาร์กิวเมนต์จาก main(def args) เป็น main(def argsNew) ซึ่งได้รับอนุญาต คุณจะไม่สามารถเข้าถึงอาร์กิวเมนต์ที่ส่งเป็น args[i] ได้อีกต่อไป คุณจะต้องใช้ argsNew[i] ตามที่กล่าวไว้ในโค้ดที่ตัดมาข้างต้น - person Aniket Thakur; 29.07.2015

หากคุณรันสคริปต์ด้วยตัวเลือก --compile-static หรือ --type-checked ตัวแปร args จะไม่สามารถมองเห็นได้ ดังนั้นการคอมไพล์จึงเกิดข้อผิดพลาด:

[การตรวจสอบประเภทคงที่] - ไม่ได้ประกาศตัวแปร [args]

ฉันชอบทำสิ่งต่อไปนี้ที่ด้านบนของสคริปต์:

import groovy.transform.Field

@Field String[] args = binding.getVariable('args') as String[]

สิ่งนี้จะแสดง args เป็นตัวแปรร่วมซึ่งสามารถใช้ได้ทุกที่ในสคริปต์


อ้างอิง:

https://stackoverflow.com/a/53783178/2089675

https://groovy-lang.org/structural.html#_variables

person smac89    schedule 05.09.2020