2 Jak wstawić zmienne, które mogą być `nic` w łańcuchy w Julii?

pytanie utworzone w Sat, Mar 16, 2019 12:00 AM

Próbuję utworzyć dynamiczny łańcuch w Julii, wstawiając wartość zmiennej do łańcucha. Wszystko działało dobrze do dziś, gdy wartość zwrócona nothing zostawiła mi błąd.

Jak dołączyć ciąg nothing? Przynajmniej bez konieczności przechodzenia przez kłopot z jakąś if n == nothing; n = "None" dla każdej zmiennej, którą chcę wstawić do ciągu.

function charge_summary(charges_df)
    if size(charges_df)[1] > 0
        n_charges = size(charges_df)[1]
        total_charges = round(abs(sum(charges_df[:amount])), digits=2)
        avg_charges = round(abs(mean(charges_df[:amount])), digits=2)
        most_frequent_vender = first(sort(by(charges_df, :transaction_description, nrow), :x1, rev=true))[:transaction_description]
        sms_text = """You have $n_charges new transactions, totaling \$$total_charges.
        Your average expenditure is \$$avg_charges.
        Your most frequented vender is $most_frequent_vender.
        """
        return sms_text
    else
        return nothing
    end
end

sms_msg = charge_summary(charges_df)


Powroty :

ArgumentError: `nothing` should not be printed; use `show`, `repr`, or custom output instead.
string at io.jl:156 [inlined]
charge_summary(::DataFrame) at get-summary.jl:18
top-level scope at none:0
include_string(::Module, ::String, ::String, ::Int64) at eval.jl:30
(::getfield(Atom, Symbol("##105#109")){String,Int64,String})() at eval.jl:91
withpath(::getfield(Atom, Symbol("##105#109")){String,Int64,String}, ::String) at utils.jl:30
withpath at eval.jl:46 [inlined]
#104 at eval.jl:90 [inlined]
hideprompt(::getfield(Atom, Symbol("##104#108")){String,Int64,String}) at repl.jl:76
macro expansion at eval.jl:89 [inlined]
(::getfield(Atom, Symbol("##103#107")))(::Dict{String,Any}) at eval.jl:84
handlemsg(::Dict{String,Any}, ::Dict{String,Any}) at comm.jl:168
(::getfield(Atom, Symbol("##14#17")){Array{Any,1}})() at task.jl:259
    
2
2 odpowiedzi                              2                         

Zdefiniuj metodę Base.string(x::Nothing):

➜  ~ julia
               _
   _       _ _(_)_     |  Documentation: https://docs.julialang.org
  (_)     | (_) (_)    |
   _ _   _| |_  __ _   |  Type "?" for help, "]?" for Pkg help.
  | | | | | | |/ _` |  |
  | | |_| | | | (_| |  |  Version 1.0.3 (2018-12-20)
 _/ |\__'_|_|_|\__'_|  |  android-termux/900b8607fb* (fork: 1550 commits, 315 days)
|__/                   |

julia> Base.string(x::Nothing) = repr(x)  # or just return the string "None", that's up to you.

julia> "$(nothing)"
"nothing"

julia>
    
2
2019-03-16 20: 32: 18Z
  1. Zauważ, że drukowanie niczego takiego jak wartości działa w innych językach, może powinni wybrać domyślne? Inny komunikat o błędzie dla tej funkcji jest mylący. Powinno być nie może zamiast nie powinno w komunikacie o błędzie. Nadal możesz ominąć to, jak pokazano.
    2019-03-16 20: 38: 08Z
  2. było domyślne, "nothing". Był to celowy wybór, aby zapobiec błędom /problemom, które w przeciwnym razie wystąpiłyby z domyślną. Zobacz # 27352
    2019-03-16 21: 28: 15Z
  3. Dokładnie i dlatego something został wprowadzony, aby umożliwić obsługę takich przypadków.
    2019-03-16 22: 40: 19Z
  4. Czy ten typ piractwa nie jest odradzany?
    2019-03-17 06: 49: 16Z
  5. Nie zaleca się przedłużania Base? Myślałem, że piractwo typu dotyczy rozszerzenia niektórych typów pakietów w innym niepowiązanym pakiecie. W każdym razie odpowiada na pytanie Jak mogę dołączyć ciąg nothing?
    2019-03-17 19: 16: 47Z

Niestety musisz jawnie obsługiwać nothing. Na przykład tak:

Your most frequented vender is $(something(most_frequent_vender, "None")).

Powodem tego jest to, że nie jest jasne, w jaki sposób chcesz, aby nothing został przekonwertowany na ciąg znaków, więc musisz podać tę wartość (w swoim przypadku, którego chcesz "None").

Krótsza wersja to:

Your most frequented vender is $(repr(most_frequent_vender)).

ale potem nothing jest drukowane jako "nothing".

    
5
2019-03-16 20: 09: 56Z
źródło umieszczone tutaj