[ruby-on-rails] not_nil에 Ruby 또는 Ruby-ism이 있습니까? nil의 반대? 방법?

나는 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


답변

부울에 지나치게 관심이있는 것 같습니다.

def logged_in?
  user
end

사용자가 nil이면 login_in? “거짓”값을 반환합니다. 그렇지 않으면 객체를 반환합니다. Ruby에서는 JavaScript처럼 “truthy”및 “falsey”값이 있으므로 true 또는 false를 반환 할 필요가 없습니다.

최신 정보

Rails를 사용하는 경우 다음 present?메소드 를 사용하여 더 잘 읽을 수 있습니다 .

def logged_in?
  user.present?
end


답변

질문에 대한 답변으로 제시 present?되는 다른 답변을 조심하십시오 .

present?blank?in rails 의 반대입니다 .

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?. 두 가지를 혼동하면 예기치 않은 오류가 발생할 수 있습니다.

귀하의 사용 사례 present?는 작동하지만 항상 차이점을 인식하는 것이 좋습니다.


답변

아마도 이것이 접근 방식 일 수 있습니다.

class Object
  def not_nil?
    !nil?
  end
end


답변

다음을 사용할 수 있습니다.

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

이것은 nil뿐만 아니라 false 등에서도 작동하므로 사용 사례에서 작동하는지 테스트해야합니다.


답변

!방법의 결과에 대해 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)

다른 답변 에서 언급했듯이 부울을 테스트하는 경우 이것은 크게 실패합니다.