web-dev-qa-db-ja.com

Ruby、またはnot_nilのRubyイズムはありますか?ゼロの反対?方法?

私はRubyを経験していないので、私のコードは「ugい」と感じ、慣用的ではありません:

def logged_in?
  !user.nil?
end

むしろ次のようなものが欲しい

def logged_in?
  user.not_nil?
end

しかし、nil?

80
berkes

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
49
lwe

ブール値に過度に関心があるようです。

def logged_in?
  user
end

ユーザーがnilの場合、logged_in? 「falsey」値を返します。それ以外の場合は、オブジェクトを返します。 Rubyでは、JavaScriptのように「真の」値と「偽の」値があるため、trueまたはfalseを返す必要はありません。

更新

Railsを使用している場合は、present? 方法:

def logged_in?
  user.present?
end
48
Samo

質問への回答として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であるかどうかを確認します。その他:空の文字列、0false、その他はnilではありません。

present?は非常に便利ですが、nil?の反対ではありません。 2つを混同すると、予期しないエラーが発生する可能性があります。

ユースケースではpresent?は機能しますが、違いを認識することは常に賢明です。

16
A Fader Darkly

たぶんこれはアプローチかもしれません:

class Object
  def not_nil?
    !nil?
  end
end
15
Geo

以下を使用できます。

if object
  p "object exists"
else
  p "object does not exist"
end

これはnilだけでなくfalseなどにも機能するため、ユースケースで機能するかどうかをテストする必要があります。

4
Bitterzoet

ブロックの代わりに _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)
_

その他の回答 で述べたように、ブール値をテストしている場合、これは劇的に失敗します。

1
Ian

ルビー風の!メソッドは、nil? 方法。

def logged_in?
  user.nil?.!
end

難解なので、RubyMine IDEはエラーとしてフラグを立てます。;-)

0