Próbuję dowiedzieć się, jak przekazać argumenty do tego obiektu SCALA:

Mam tę klasę napisaną na tej ścieżce projektu SBT: allaboutscala/src/main/scala/gzip_practice/gzipwriter

package gzip_practice

import java.io._
import java.util.zip._

/** Gzcat
    */
object gzcat extends App {
    private val buf = new Array[Byte](1024)

    try {
        for (path <- args) {
            try {
                var in = new GZIPInputStream(new FileInputStream(path))
                var n = in.read(buf)
                while (n >= 0) {
                    System.out.write(buf, 0, n)
                    n = in.read(buf)
                }
            }
            catch {
                case _:FileNotFoundException =>
                    System.err.printf("File Not Found: %s", path)
                case _:SecurityException =>
                    System.err.printf("Permission Denied: %s", path)
            }
        }
    }
    finally {
        System.out.flush
    }
}

Jest to projekt SBT o nazwie allaboutscala. Próbuję go uruchomić: scala src/main/scala/gzip_practice/gzipwriter.scala "hi" Ale polecenie wisi i nie wiem dlaczego.

Jak mam uruchomić ten konstruktor obiektu z Argami?

0
Jwan622 4 czerwiec 2018, 18:02

3 odpowiedzi

Najlepsza odpowiedź

Możesz użyć polecenia scala jako biegacza skryptu.

Zwykle zostanie awidłowy kod "skryptowy" w głównej metodzie.

Ale jeśli masz obiekt z metodą główną, jak App, użyje tego dla punktu wejścia.

Nie lubi instrukcji package w skrypcie.

Jeśli komentujesz oświadczenie package, możesz skompilować i uruchomić za pomocą:

scala -nc somefile.scala myarg.gz

-nc oznacza "Demon kompilacyjny"; W przeciwnym razie rozpocznie drugi proces, aby skompilować skrypty, dzięki czemu kolejne kompilowanie się szybciej; Ale jest to kruche przepływ pracy i nie polecam tego. Potwierdziłem, że działa kod.

Zwykle ludzie używają SBT lub IDE do kompilacji i opakowania w słoiku do uruchomienia z scala myapp.jar.

1
som-snytt 5 czerwiec 2018, 15:17

object jest statyczną instancją klasy. Możesz go skonstruować za pomocą:

object gzcat(args: String*) extends App {
  ...
}

args jest związany jako val w obiekcie gzcat.

0
Bob Dalgleish 4 czerwiec 2018, 15:29

Czy próbujesz uruchomić go z REP? Proponuję uruchomienie go z SBT, możesz uruchomić projekty SBT z katalogu głównego projektu z parametrem wiersza poleceń w następujący sposób:

sbt "run file1.txt file2.txt"

Cytaty są wymagane. Jeśli opuścisz SBT Shell Open, to działa, będzie znacznie szybciej. Otwarta skorupa w korzeniu projektu

sbt

W skorupce SBT:

run file1.txt file2.txt

W skorupce SBT nie ma cytatów.

0
Pietrotull 4 czerwiec 2018, 15:45