私はRubyを経験していないので、私のコードは「ugい」と感じ、慣用的ではありません:
def logged_in?
!user.nil?
end
むしろ次のようなものが欲しい
def logged_in?
user.not_nil?
end
しかし、nil?
activeSupportを使用している場合、user.present?
http://api.rubyonrails.org/classes/Object.html#method-i-present%3F 、nil以外をチェックするために、使用しない理由
def logged_in?
user # or !!user if you really want boolean's
end
ブール値に過度に関心があるようです。
def logged_in?
user
end
ユーザーがnilの場合、logged_in? 「falsey」値を返します。それ以外の場合は、オブジェクトを返します。 Rubyでは、JavaScriptのように「真の」値と「偽の」値があるため、trueまたはfalseを返す必要はありません。
更新
Railsを使用している場合は、present?
方法:
def logged_in?
user.present?
end
質問への回答としてpresent?
を提示する他の回答に注意してください。
present?
は、Railsのblank?
の反対です。
present?
は、意味のある値があるかどうかを確認します。これらのことは、present?
チェックに失敗する可能性があります。
"".present? # false
" ".present? # false
[].present? # false
false.present? # false
YourActiveRecordModel.where("false = true").present? # false
!nil?
チェックは以下を提供します:
!"".nil? # true
!" ".nil? # true
![].nil? # true
!false.nil? # true
!YourActiveRecordModel.where("false = true").nil? # true
nil?
は、オブジェクトが実際にnil
であるかどうかを確認します。その他:空の文字列、0
、false
、その他はnil
ではありません。
present?
は非常に便利ですが、nil?
の反対ではありません。 2つを混同すると、予期しないエラーが発生する可能性があります。
ユースケースではpresent?
は機能しますが、違いを認識することは常に賢明です。
たぶんこれはアプローチかもしれません:
class Object
def not_nil?
!nil?
end
end
以下を使用できます。
if object
p "object exists"
else
p "object does not exist"
end
これはnilだけでなくfalseなどにも機能するため、ユースケースで機能するかどうかをテストする必要があります。
ブロックの代わりに _Symbol#to_proc
_ shorthand を使用できるように、オブジェクトメソッドを探してこの質問に到達しました。 arr.find(&:not_nil?)
は_arr.find { |e| !e.nil? }
_よりも多少読みやすいと思います。
私が見つけたメソッドは _Object#itself
_ です。私の使用法では、キーname
のハッシュ内の値を検索したかったのですが、場合によっては、そのキーが誤ってName
として大文字になりました。そのワンライナーは次のとおりです。
_# Extract values for several possible keys
# and find the first non-nil one
["Name", "name"].map { |k| my_hash[k] }.find(&:itself)
_
その他の回答 で述べたように、ブール値をテストしている場合、これは劇的に失敗します。
ルビー風の!
メソッドは、nil?
方法。
def logged_in?
user.nil?.!
end
難解なので、RubyMine IDEはエラーとしてフラグを立てます。;-)