Jak lepiej użyć switcha w Julii?

Jak lepiej użyć switcha w Julii?
Julian_
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 1703
0
Kopiuj
function foo(drvName)
    if drvName == "jdbc" 
        defaultJdbc()
    elseif drvName == "odbc"
        defaultOdbc()
     else
        defaultNullDriver()
    end
end

czy

Kopiuj
function foo(drvName)
    drv = if drvName == "jdbc" 
              defaultJdbc
          elseif drvName == "odbc"
              defaultOdbc
           else
              defaultNullDriver
          end
    drv() 
end

czy

Kopiuj
function foo(drvName)
    (if drvName == "jdbc" 
        defaultJdbc
    elseif drvName == "odbc"
        defaultOdbc
    else
        defaultNullDriver
    end)()
end
flowCRANE
  • Rejestracja: dni
  • Ostatnio: dni
  • Lokalizacja: Tuchów
  • Postów: 12269
0

Nie widzę tu żadnego switcha. Serio ten język nie posiada instrukcji wyboru? :D

hauleth
  • Rejestracja: dni
  • Ostatnio: dni
1

Ogólnie to w takim wypadku chyba najlepiej albo użyć mapy:

Kopiuj
DRIVERS = Dict("jdbc" => defaultJdbc, "odbc" => defaultOdbc)

function foo(drvName)
    get(DRIVERS, drvName, defaultNullDriver)()
end

Lub nawet lepiej, użyć polimorfizmu:

Kopiuj
abstract type DB end

struct ODBC <: DB end
struct JDBC <: DB end
struct NullDB <: DB end

function default(_::ODBC)
  print("odbc")
end

function default(_::JDBC)
  print("jdbc")
end

function default(_::NullDB)
  print("null")
end

DRIVERS = Dict("jdbc" => JDBC(), "odbc" => ODBC())

function get_driver(name)
  get(DRIVERS, name, NullDB())
end

function foo(driver::DB)
  default(driver)
end

foo(get_driver("jdbc"))
Julian_
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 1703
0

czyli lepiej tak:

hauleth napisał(a):
Kopiuj
DRIVERS = Dict("jdbc" => defaultJdbc, "odbc" => defaultOdbc)

function foo(drvName)
    get(DRIVERS, drvName, defaultNullDriver)()
end

niż tak:

Kopiuj
DRIVERS = Dict("jdbc" => defaultJdbc, "odbc" => defaultOdbc)

function foo(drvName)
   drv = get(DRIVERS, drvName, defaultNullDriver)
   drv()
end

i niż tak:

Kopiuj
DRIVERS = Dict("jdbc" => defaultJdbc(), "odbc" => defaultOdbc())

function foo(drvName)
   get(DRIVERS, drvName, defaultNullDriver)
end

?

hauleth
  • Rejestracja: dni
  • Ostatnio: dni
0

Twój pierwszy przykład jest identyczny z moim, z tą różnicą, że tworzysz dodatkową zmienną.

Drugi przykład robi zupełnie coś innego.

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.