문제

나는 그것이 nil인지 0인지 확인하기 위해 간결한 방법을 찾고 있습니다. 현재 나는 다음과 같은 일을하고 있습니다.

if (!val || val == 0)
  # Is nil or zero
end

그러나 이것은 매우 서투른 것 같습니다.

도움이 되었습니까?

해결책

물체에는 a 무? 방법.

if val.nil? || val == 0
  [do something]
end

또는 하나의 지침으로 :

[do something] if val.nil? || val == 0

다른 팁

마지막에 물음표가있는 메소드 이름을 정말로 좋아한다면 :


if val.nil? || val.zero?
  # do stuff
end

다른 솔루션과 마찬가지로 솔루션은 괜찮습니다.

루비는 조심하지 않으면 모든 것을 할 수있는 예쁜 방법을 찾게 할 수 있습니다.

먼저 나는 그것이 당신이 특정 조건을 확인할 수있는 가장 간결한 방법에 관한 것이라고 생각합니다.

둘째, 나에게 이것은 디자인의 잠재적 결함을 나타내는 코드 냄새입니다. 일반적으로 nil과 Zero는 같은 것을 의미하지 않아야합니다. 가능하다면 방법의 시작 부분이나 다른 메커니즘에서 확인 하여이 코드를 누르기 전에 Val이 NIL이 될 가능성을 제거해야합니다.

이 작업을 수행해야 할 완벽하게 합법적 인 이유가있을 수 있습니다.이 경우 코드가 좋다고 생각하지만 최소한 가능하다면 NIL 점검을 제거하려고 노력할 것입니다.

Ruby 2.3.0에서 안전한 내비게이션 연산자를 결합 할 수 있습니다 (&.) 와 함께 Numeric#nonzero?. &. 보고 nil 인스턴스 인 경우 nil 그리고 nonzero? - 숫자가 있다면 0:

unless val&.nonzero?
  # Is nil or zero
end

또는 postfix :

do_something unless val&.nonzero?

객체를 사용할 수 있습니까? NIL을 구체적으로 테스트하기 위해 (거짓과 NIL 사이를 따라 잡지 않음). 원숭이 패치 메소드도 객체에 도출 할 수 있습니다.

class Object
   def nil_or_zero?
     return (self.nil? or self == 0)
   end
end

my_object = MyClass.new
my_object.nil_or_zero?
==> false

동료가 추적하기가 어렵고 코드를 다른 사람에게 예측할 수 없게 만들 수 있기 때문에 이것은 권장되지 않습니다.

나는 당신의 코드가 틀렸다고 생각합니다. 실제로 세 가지 값을 테스트합니다. nil, false, 그리고 0. 이거 때문입니다 !val Ruby에서는 거짓 인 모든 값에 대해 표현이 참입니다. nil 그리고 false.

내가 지금 생각 해낼 수있는 최선은

if val == nil || val == 0
  # do stuff
end

물론 어느 것이 영리하지 않지만 (매우) 분명합니다.

nil.to_i는 0을 반환하므로 종종 다음을 수행합니다.

val.to_i.zero?

그러나 val이 응답하지 않는 객체 인 경우 예외가 발생합니다.

내 솔루션은 조건부를 빼고 세련미를 사용합니다.

module Nothingness
  refine Numeric do
    alias_method :nothing?, :zero?
  end

  refine NilClass do
    alias_method :nothing?, :nil?
  end
end

using Nothingness

if val.nothing?
  # Do something
end

Rails는 속성 쿼리 메소드를 통해이를 수행하며, 여기서 False 및 Nil, 0 및 "" "도 False로 평가됩니다.

if (model.attribute?) # => false if attribute is 0 and model is an ActiveRecord::Base derivation

그러나 그것은 낙담 자들의 비중을 가지고 있습니다. http://www.joegrossberg.com/archives/002995.html

가능한 한 관용적으로, 나는 이것을 제안 할 것이다.

if val.nil? or val == 0
    # Do something
end

왜냐하면:

  • nil을 사용합니까? 방법.
  • ||보다 선호되는 "또는"연산자를 사용합니다.
  • 이 경우에는 필요하지 않은 괄호를 사용하지 않습니다. 괄호는 특정 연산자의 우선 순위를 우선하는 등 어떤 목적을 수행 할 때만 사용해야합니다.

가장 짧고 가장 좋은 방법

if val&.>(0)
  # do something
end

을 위한 val&.>(0)Val이 기본적으로 방법이기 때문에 Val이 NIL이되면 NIL을 반환합니다. 그것은 거짓을 반환합니다 val == 0.

짧고 명확합니다

[0, nil].include?(val)

나는 "is?"를 정의함으로써 이것을 다룹니다. 그런 다음 다양한 클래스에서 다르게 구현할 수있는 방법. 배열의 경우 "Is?" "크기> 0"을 의미합니다. Fixnum의 경우 "self! = 0"을 의미합니다. 문자열의 경우 "self! = ''"를 의미합니다. 물론 Nilclass는 "IS?"를 정의합니다. 그냥 돌아 오는 것만으로도.

당신이 사용할 수있는 case 당신이 좋아한다면 :

 case val with nil, 0
      # do stuff
 end

그런 다음 함께 작동하는 모든 것을 사용할 수 있습니다 ===, 때때로 좋습니다. 또는 다음과 같은 일을하십시오.

not_valid = nil, 0
case val1 with *not_valid
      # do stuff
 end
 #do other stuff
 case val2 with *not_valid, false    #Test for values that is nil, 0 or false
      # do other other stuff
 end

정확히 좋은 OOP는 아니지만 매우 유연하고 작동합니다. 나의 ifs는 일반적으로 끝납니다 case어쨌든.

물론 Enum.any?/Enum.include? 일종의 작품도 ... 당신이 정말로 암호를 원한다면 :

if [0, nil].include? val
    #do stuff
end

옳은 일은 물론 메소드 나 함수를 정의하는 것입니다. 또는 많은 값으로 동일한 작업을 수행 해야하는 경우 멋진 반복자의 조합을 사용하십시오.

나는 정말로 레일을 좋아한다 blank? 그런 종류의 것들을위한 방법이지만 반환되지 않습니다. true ~을 위한 0. 그래서 당신은 당신의 방법을 추가 할 수 있습니다 :

def nil_zero? 
  if respond_to?(:zero?) 
    zero? 
  else 
    !self 
  end 
end 

그리고 일부 값이 NIL인지 또는 0인지 확인합니다.

nil.nil_zero?
=> true
0.nil_zero?
=> true
10.nil_zero?
=> false

if val.nil_zero?
  #...
end

원숭이를 수업을 패치하는 대신 정제를 사용할 수 있습니다 루비 2.1에서 시작. 정제는 원숭이 패치와 유사합니다. 이를 통해 클래스를 수정할 수 있지만 수정은 사용하려는 범위로 제한됩니다.

이 점검을 한 번 수행하려면 과잉이지만, 자신을 반복하는 경우 원숭이 패치에 대한 훌륭한 대안입니다.

module NilOrZero
  refine Object do
    def nil_or_zero?
      nil? or zero?
    end
  end
end

using NilOrZero
class Car
  def initialize(speed: 100)
    puts speed.nil_or_zero?
  end
end

car = Car.new              # false
car = Car.new(speed: nil)  # true
car = Car.new(speed: 0)    # true

개선이 변경되었습니다 마지막 순간에 파일에 범위를두고 있습니다. 따라서 이전 예제가 이것을 보여 주었을 수 있으며, 이는 작동하지 않을 것입니다.

class Car
  using NilOrZero
end

이것은 매우 간결합니다.

if (val || 0) == 0
  # Is nil, false, or zero.
end

치료를 신경 쓰지 않는 한 작동합니다 false 동일합니다 nil. 내가 작업 한 프로젝트에서 그 차이는 가끔만 중요합니다. 나머지 시간은 개인적으로 건너 뛰는 것을 선호합니다. .nil? 코드가 약간 짧습니다.

[업데이트: 나는 더 이상 이런 종류의 글을 쓰지 않습니다. 작동하지만 너무 비밀 스럽습니다. 나는 내가 한 곳의 몇 곳을 바꾸어 내 잘못을 바로 잡으려고 노력했다.

그건 그렇고, 나는 사용하지 않았다 .zero? 이것은 예외를 제기하기 때문에 val 예를 들어 문자열입니다. 하지만 .zero? 그렇지 않다는 것을 알고 있다면 괜찮을 것입니다.

이것은 nil 및 zero에 대해 true로 평가됩니다. nil.to_s.to_d == 0

unless (val || 0).zero?

    # do stufff

end

다른 해결책 :

if val.to_i == 0
  # do stuff
end
val ||= 0
if val == 0
# do something here
end
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top