私はRubyの経験がないので、コードは「醜い」と感じ、慣用的ではありません。
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
false.present? == false
!false.nil? == true
ブール値に過度に関心があるようです。
def logged_in?
user
end
ユーザーがnilの場合、logged_in?「false」値を返します。それ以外の場合は、オブジェクトを返します。RubyではJavaScriptのように「真実」と「偽」の値があるため、trueまたはfalseを返す必要はありません。
更新
Railsを使用している場合は、次のpresent?
メソッドを使用して、これをより適切に読み取ることができます。
def logged_in?
user.present?
end
?
は、ブール値を返すことです。!!value
何かをブール値に変換する古典的な方法です。まったく同じではありませんが、この場合Object#present?
はRoRでも問題ありません。
present?
質問への回答として提示される他の回答に注意してください。
present?
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?
はうまくいきますが、違いを認識することは常に賢明です。
false.blank?
と同じではありませんfalse.nil?
多分これはアプローチかもしれません:
class Object
def not_nil?
!nil?
end
end
!self.nil?
ではなく!nil?
、またはself
暗黙的ですか?
!
メソッドの結果についてRuby-esque メソッドを提供してもよいnil?
ですか。
def logged_in?
user.nil?.!
end
RubyMine IDEがエラーとしてフラグを立てるほど難解です。;-)
ブロックの代わりにSymbol#to_proc
省略形を使用できるように、オブジェクトメソッドを探しているこの質問に到達しました。私は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)
他の回答で述べたように、ブール値をテストしている場合、これは見事に失敗します。
my_hash.values_at("Name", "name").find
ですか?
map
は、この例で簡単にするために削除した他のロジックがいくつかありました。そのため、ここでは、と交換可能values_at
です。重要な部分は、渡されるものfind
です。
present?
空白以外の文字列が必要です。! "".nil?
trueを返しますが、"".present?
falseを返します。