2017-11-12 17 views
1

私はnilまたは非nilいずれかの値を返す関数を持っている、と私は、次のifでそれを使用する - else句:'elsif'ブランチで関数を何度も呼び出さないようにする方法はありますか?

if condition_that_doesnt_involve_my_func 
    # do stuff 
elsif my_func(cur_line) 
    headers_found = my_func(cur_line) 
end 

私はそれが二度関数を呼び出すため、上記のブロックは多少無駄であると感じ分岐結果がnilと評価された場合は、結果を1回だけ保存してから次の節で使用することができます。

私は関数を1回呼び出すようにこれを書き換える方法はありますか?

elsif headers_found = my_func(cur_line) 

私はお勧めしませんとRubocopはどちらかそれを好きではない:

+0

値が真である場合、または偽の値をheaders_foundに割り当てても問題ない場合は、戻り値を割り当てたいですか? – spickermann

答えて

2

あなたが書くことができます。

+0

私は混乱しています...あなたはちょうど答えとしてあなたが入力したソリューションをお勧めしないでしょうか?推奨する解決策はありますか? – Dave

+1

非常に短い例を提供しただけで、これをさらに短くする唯一の方法です。しかし、私はそれが可読性の観点からは改善されていないと思う。 'if'の後に' == 'の条件を期待するかもしれないが、' = 'を使って代入するのではない(これはRubocopが不平を言っているので)混乱を招くかもしれない。たぶんもっと長い例を提供すればもっと良い方法があるかもしれません... – spickermann

+0

人はいつも私の質問に最も単純な量のコードを入れなければならないと不満を持ちます。それでも、私は詳細を追加するように編集しました。それほどではありませんが、実際にはそれだけです。それはかなり基本的です。私は何を言っているのか分かりますよね?私は、私が必要とする以上に何度も機能を呼びたくはありません。 – Dave

2

これを試してみてください:rubocopはこの時に吠えます

if condition_that_doesnt_involve_my_func 
    # do stuff 
elsif answer = my_func(cur_line) 
    headers_found = answer 
end 

わからない場合。私はそれを使用しません。

+0

"condition_that_doesnt_involve_my_func"がtrueの場合は、何も保存していません。 tahtの場合は、あなたのソリューションは "my_func"を1回呼び出しますが、リストにあるコードでは決して呼び出されません。 – Dave

+0

@Dave - 編集 – seph

+0

を参照してください。だから、spickermannもその点を作っていました。ここでの選択は、基本的に私は効率性や可読性を持ちますが、両方を持つことはできませんか?この例は非常に基本的なようですが、私は両方を持つ方法があると思いますが、私はまだこれに初心者です。 – Dave

0

あなたが心配している場合は、戻り値をheaders_foundに割り当ててください。偽(headers_found.present? #false)またはヘッダーを含むことになります。

if condition_that_doesnt_involve_my_func 
    # do stuff 
else 
    headers_found = my_func(cur_line) 
end 
+0

残念ながら、私はすでに "else"節を私のステートメントに持っているので、 "elsif"を使わなければなりませんでした。 – Dave

+0

私は見たことがない(...)と言うのは難しいです。いずれにしても、大きなifの前に呼び出しを追加し、関数を一度呼び出すだけの場合は、そこから再作成することができます。最終的には、何か読めるものが必要になります。 – s1mpl3