Jak lepiej użyć switcha w Julii?

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

czy

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

czy

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

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

1

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

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

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

Lub nawet lepiej, użyć polimorfizmu:

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"))
0

czyli lepiej tak:

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

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

niż tak:

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

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

i niż tak:

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

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

?

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.

1 użytkowników online, w tym zalogowanych: 0, gości: 1