IT이야기

object.presence의 포인트

cyworld 2021. 4. 22. 21:13
반응형

object.presence의 포인트는 무엇입니까?


Rails 문서 에서 메소드 대해 제공된 예제object.presence 는 다음과 같습니다.

region = params[:state].presence || params[:country].presence || 'US'

그러나 다음과 같은 것은 아닙니다.

region = params[:state] || params[:country] || 'US'

사용의 요점은 무엇입니까 presence?


요점은 다음과 같습니다.

''.presence
# => nil

그래서 만약 params[:state] == '':

region = params[:state].presence || 'US'
# => 'US'
region = params[:state] || 'US'
# => ''

또한 메서드에 nil응답하는 모든 개체 에서 유사한 방식으로 작동합니다 (즉, 개체가 '비어있는 경우' 반환 ). empty?예를 들면 다음과 같습니다.

[].presence
# => nil

다음은 참고 용 문서입니다.

http://api.rubyonrails.org/classes/Object.html#method-i-presence


내가 깔끔하게 찾은 유용한 방법으로 사용했습니다. 내 변수는 문자열이고, 빈 문자열이면 nil을, 그렇지 않으면 정수로 변환하고 싶습니다.

 x.presence.try(&:to_i)

 "".presence.try(&:to_i) # => nil
 "22".presence.try(&:to_i) # => 22

presencenil객체가 없으면 반환 하고 객체가 있으면 객체 자체 를 반환하려는 경우 매우 유용합니다 . 즉, 다음과 같은 코드가 필요합니다.

object.present? object : nil

위의 줄 대신 단순히 호출 할 수 있으며 object.presence메서드가 작업을 수행합니다.


또 다른 예로, presence제가 가장 좋아하는 FizzBuzz 솔루션을 소개 하겠습니다 .

puts 1.upto(100).map { |n| "#{'Fizz' if n%3==0}#{'Buzz' if n%5==0}".presence || n }

사용의 실제 지점 #presence이 있다는 것입니다 확장 의 개념 falsey 값을 웹 및 HTTP 시나리오를 처리 할 수 있습니다. 문서는이 목적을 명확하게하지 않습니다 ... 대신 단순히 메소드의 API에 초점을 맞추고 있습니다. The what but not the why . 웹과 HTTP는 일반 프로그래밍과 다릅니다. 빈 문자열은 종종 nil요청 대신에 얻는 것이기 때문 입니다.

그러나 일반 Ruby에서는 빈 문자열이 진실 입니다. 이로 인해 웹 개발자 Object.presence는 여기에 다른 사람들이 인용 한 것처럼 예제로 사용 하기 위해 문서와 같은 중복 된 상용구 코드를 많이 작성합니다 .

레일에서 웹 응용 프로그램을 작성하는 사람들을위한 결론은 우리가 지금 사용 (해야) 할 수 있다는 것입니다 #present?#presence표준 루비 합선으로 ||:

# Check for a param like this
@name = params[:name].presence || 'No name given'

이 줄은 웹 서버 request가 우리 를 위해 매개 변수에 포장하는 모든 것을 적절하게 처리합니다 . 이 평범한 오래된 루비는 그렇지 않습니다.

# DON'T DO THIS
@name = params[:name] || 'No name given'

참조 URL : https://stackoverflow.com/questions/19637499/what-is-the-point-of-object-presence

반응형