2014-10-19 3 views
10

Julia의 '우수 사례'에 대한 질문입니다. 나는 thisthis을 읽었다. 심지어 나는 잊지 - 나는 이러한 인수가 무엇을 의미하는지 분명하지 않다 그래서Julia에서 자연적인 기본값이없는 명명 된 인수

discount_rate(10, 10, 10, -10) 

같은 메소드를 호출 할 필요가있다 지금 함수

function discount_rate(n, fv, pmt, pv; pmt_type = 0) 
... 
end 

에게 문제가있다. 내가하고 싶은 것은 쓰기입니다.

discount_rate(n = 10, fv = 10, pmt = 10, pv = -10) 

그것은 명확합니다. 이해하기 쉽습니다. 그러나 나는 인수가 keywords 인수가 아니면 optional 인수를 내 메서드로 정의 할 수 없다. 왜냐하면 그들은 자연어을 가지지 않기 때문이다. 디자인의 관점에서, 이것에 대한 권장 방법이 있습니까?

답변

6

다음을 수행 할 수 없습니다 :로

function discount_rate(;n=nothing,fv=nothing,pmt=nothing,pv=nothing,pmt_type=0) 
    if n == nothing || fv == nothing || pmt == nothing || pv == nothing 
     error("Must provide all arguments") 
    end 
    discount_rate(n,fv,pmt,pv,pmt_type=pmt_type) 
end 

function discount_rate(n, fv, pmt, pv; pmt_type = 0) 
    #... 
end 
+1

감사합니다. Iain. 또한 YouTube에서 Julia 비디오 자습서를 매우 유용하게 사용했습니다. – vathymut

0

를 후속, 그것은 지루한 조금을 가지고있어 (재) 이미했다 기능에 대한 키워드 만 대응 물품. 위 이안의 대답에 의해 영감을, 나는 그것의 생성 예를 들어,

f(a, b) = a/b 
@show f(1, 2) 
f(1,2) => 0.5 

을 본질적으로 같은 일을 매크로 ...

macro make_kwargs_only(func, args...) 
quote 
    function $(esc(func))(; args...) 
    func_args = [ arg[2] for arg in args ] 
    return $(esc(func))(func_args...) 
    end 
end 
end 

그래서 쓴 키워드를 전용 대응은

@make_kwargs_only f a b 
@show f(a = 1, b = 2) 
f(a=1,b=2) => 0.5 
을 제공합니다

그러나 이것은 일반적인 경우는 아닙니다. 여기서 논쟁의 순서가 중요합니다. 이상적으로는 매크로가 f(a = 1, b = 2)f(b = 2, a = 1) 모두 같은 방식으로 작동하는 것이 좋았습니다. 그건 사실이 아니야. 내가 인수의 순서를 기억하지 못하는 경우

@show f(b = 2, a = 1) 
f(b=2,a=1) => 2.0 

그래서 지금은 해킹으로, 나는 methods(f) 사용합니다. 두 경우를 처리하기 위해 매크로를 다시 작성하는 방법에 대한 제안은 환영합니다 ... 어쩌면 함수 이름이 func 인 매크로 함수 정의 내에서 func_args을 정렬 할 수 있습니까?

관련 문제