2017-08-01 25 views
1

私はこのような機能を持っているかもしれませんジュリアでの関数呼び出しで使用されているかどうかを確認するための「ベストプラクティス」の方法は何ですか?正確には、私はおそらく行うことができます知っている:オプションの引数は、Pythonで

function sum_these(x, y=0) 
    if y == 0 
     y = 1 
    end 
    x + y 
    end 

しかし、私はむしろ、pythonでNoneと同じ意味で、代わりにいくつかの値をゼロを使用していないと思います

EDIT

だけのために明快さのために、これらの関数の結果は重要ではありません。 yがNoneの場合に発生するイベント(any)は重要であり、y = [some number]の設定は望ましくありません。あなたの質問は少し混乱して

function sum_these(x, y=nothing) 
    if y == nothing 
     do stuff 
    end 
    return something 
+0

これはあなたのユースケースには適していないかもしれませんが、しばしばこれを行う必要はなく、代わりにデフォルトの '1'や引数のいくつかの関数を設定することができます。 –

+2

ユースケースはちょっと不思議なので、参考にするのは難しいです。しかし、もう一つの方法は、 'sum_these(x)'と 'sum_these(x、y)'という2つの別個のメソッドを定義することです。より詳細な情報を提供すれば、より簡単に手助けすることができます。 – DNF

答えて

3
function sum_these(x, y=nothing) 
    if y == nothing 
    do stuff 
    end 
    return something 
end 

。私はこれについて奥行きはin a blog postと言っていますが、実際の意味では、関数の自動特殊化により、型安定/推測可能な関数では常に自由であることをチェックすることができます。

しかし、あなたは2つの異なる機能にこれを分割を検討する必要があります。もちろん

function sum_these(x) 
    return something 
end 

function sum_these(x, y) 
    do stuff 
    return something 
end 

、これは単なるスタイルの違いで、正しい選択をreturn somethingに共有されているどのくらいのコードによって決定されます。

+0

質問は「ベストプラクティス」に関するものでした。その場合、「y = nothing」バージョンはそれほどよくないと私は思っています。私の印象は、複数のディスパッチを明示的に使用するのではなく、入力が1つしかない状況を処理し、それに「Pythonのやり方」をするというラウンドアバウトの方法です。 2つの入力が提供されているが、2つ目の入力が「何もない」場合はどうでしょうか?その後、単一の引数メソッドと同じように扱われますが、代わりにエラーになることがあります。 スタイルの問題として、私は2つの方法に分割する方が良いと思います。 – DNF

+0

しかし、常に良いとは限りません。繰り返しコードがたくさんある場合は、それらをまとめるほうがよいでしょう。関数を分割した場合は、 'return something'の部分に' _do_something(...) 'という内部関数があります。いつものように、状況によって異なります。しかし、シングルトンに対するコンパイラの最適化が両方の形式を最適にするという重要な事実です。 –

+0

はい、この質問には明確な答えはありません。なぜなら細部はあまりないから、私の提案は必ずしも良いものではありません。しかし、私はOPの意図について推測しようとしていました。私の推測では、問題の核心は、1つまたは2つの入力を持つ可能性のある関数を作成する方法でした。デフォルトの答えは、私は、2つの異なる方法を使用すると信じていますが、それは確かに他の状況に依存します。 – DNF

0

:誰かがより良い解決策は次のように何かをすることです提供しない限り、いくつかの検索後、私は、と思います。何がしたいことは

function sum_these(x, y=1) 
    return x + y 
end 

であるように思える。しかし、あなたの例ではsum_these(3, 0)を呼び出す場合でも、それはPythonでも1

で0を置き換えるので、それは非常に、あなたがいずれかの求めているものを行いません。私は使用します

def sum_these(x, y=1): 
    return x + y 

私はおそらくあなたの質問を誤解します。

2

空のフォールバックを使用して複数のディスパッチを使用することはできますか?

function f(x, y=nothing) 
    ... 
    do_something(x, y) 
    ... 
    return something 
end 

do_something(x, y) = nothing 
function do_something(x, y::Void) 
    ... 
end 

は、必要に応じてdo_somethingに他の関連するVARSを追加し、何かを返すか、必要に応じて変異させます。だけではなく、完全に罰金ですが、nothingはタイプVoidのシングルトンであるため、if文は、ここで実際には実行時のコストではありませんので、y==nothingが実際に離れてコンパイルします

関連する問題