無脂肪CRMのソースコードを勉強中です。アプリヘルパーの1つにあるこの特定のコード行が何をするのかを理解しようとしています:
options[:selected] = (@account && @account.id) || 0
オプション ハッシュの値をキー:selected
でインスタンス変数の値@account
または0
(@account
存在しない場合) に設定しているようです。
何をしているの&& @account.id
ですか?
無脂肪CRMのソースコードを勉強中です。アプリヘルパーの1つにあるこの特定のコード行が何をするのかを理解しようとしています:
options[:selected] = (@account && @account.id) || 0
オプション ハッシュの値をキー:selected
でインスタンス変数の値@account
または0
(@account
存在しない場合) に設定しているようです。
何をしているの&& @account.id
ですか?
虚偽でないことを確認して@account
おり、そうでない場合は、オプションをアカウントの に設定しますid
。長い手で書くと、これと同等になります:
options[:selected] = if @account && @account.id
@account.id
else
0
end
または
options[:selected] = (@account && @account.id) ? @account.id : 0
私はおそらく、次のように見える宝石を使用します。andand
options[:selected] = @account.andand.id || 0
それは書くことと同等であり、
options[:selected] = (@account != nil ? (@account.id != nil ? @account.id : 0) : 0)
ただし、Ruby プログラマーは、上記のコードが実際に判読不能になる可能性があることがわかるため、質問で示した方法を好みます。また、Ruby (および JavaScript などの他の動的プログラミング言語) には、簡潔で読みやすいコードを記述できるように、真値と偽値の概念があります。この記事でそれについて読むことができます:真実の質問.
options[:selected] = (@account && @account.id) || 0
このコード行は、or 0 ではなく、or 0 に設定さoptions[:selected]
れます。その理由は、評価された最後のステートメントを返すためです。これは、両方が true の場合です。@account
@account.id
(@account && @account.id)
@account.id
他の人が言ったように、最初に実際に存在(@account && @account.id)
することを確認します。@account
存在する場合は、短絡のおかげで、存在するかどうかを確認し、@account.id
存在する場合はそれに設定options[:selected]
します。ただし、@account
存在しない場合、値は 0 に設定されます。