답변:
defined?
키워드 ( documentation )를 사용하십시오 . 항목의 종류가 있거나 nil
존재하지 않는 경우 String을 반환 합니다.
>> a = 1
=> 1
>> defined? a
=> "local-variable"
>> defined? b
=> nil
>> defined? nil
=> "nil"
>> defined? String
=> "constant"
>> defined? 1
=> "expression"
skalee는 다음과 같이 말했습니다 : "nil로 설정된 변수가 초기화되었다는 점에 주목할 가치가 있습니다."
>> n = nil
>> defined? n
=> "local-variable"
||=
연산자 포함)를 참조하십시오.
defined?
에서 변수를 정의하면 해당 블록 내에 정의 된 변수에 대해 true를 반환합니다.
defined?
부울을 반환 하는 것과 같은 방법이 있습니까?
!!defined?(object_name)
존재하는 경우 아무것도하지 않고 존재하지 않는 경우 생성하려는 경우에 유용합니다.
def get_var
@var ||= SomeClass.new()
end
새 인스턴스를 한 번만 만듭니다. 그 후에는 var를 계속 반환합니다.
||=
혼란의 고통을 느끼지 않도록 부울 값과 함께 사용하지 마십시오 .
nil
뿐만 아니라 당신이하지 않으면 정말 이는 반환하지 않습니다 때 호출 식마다 시간을 평가하려는nil
var = (var or var.nil?)
위 문장의 올바른 구문은 다음과 같습니다.
if (defined?(var)).nil? # will now return true or false
print "var is not defined\n".color(:red)
else
print "var is defined\n".color(:green)
end
var
변수를 ( )로 바꾸십시오. 이 구문은 if 문에서 평가할 true / false 값을 반환합니다.
defined?(var) == nil
?
.nil?
것은 그들이 말하는 것처럼 관용적입니다. nil
비교 연산자를 사용하는 것 보다 객체를 요청하는 것이 더 "객체 지향적" 입니다. 읽기도 어렵지 않으므로 더 많은 제품을 배송하는 데 도움이되는 것을 사용하십시오.
"if"대신 "unless"를 시도하십시오
a = "apple"
# Note that b is not declared
c = nil
unless defined? a
puts "a is not defined"
end
unless defined? b
puts "b is not defined"
end
unless defined? c
puts "c is not defined"
end
여기에 몇 가지 코드가 있지만 로켓 과학은 없지만 잘 작동합니다.
require 'rubygems'
require 'rainbow'
if defined?(var).nil? # .nil? is optional but might make for clearer intent.
print "var is not defined\n".color(:red)
else
print "car is defined\n".color(:green)
end
분명히이 색칠 예제는 필요하지 않으며이 장난감 예제에서 멋진 시각화 일뿐입니다.
nil?
선택 사항 이기 때문일 것 입니다.
이것이 핵심 답입니다 : defined?
방법. 위의 대답은 이것을 완벽하게 보여줍니다.
그러나 파도 아래에 숨어있는 상어가 있습니다 ...
이 유형의 일반적인 루비 패턴을 고려하십시오.
def method1
@x ||= method2
end
def method2
nil
end
method2
항상을 반환합니다 nil
. 을 처음 호출 method1
하면 @x
변수가 설정되지 않으므로 method2
실행됩니다. 로 method2
설정 @x
됩니다 nil
. 괜찮습니다. 하지만 두 번째로 전화하면 어떻게됩니까 method1
?
@x는 이미 nil로 설정되어 있습니다. But method2
여전히 다시 실행됩니다 !! method2가 비용이 많이 드는 작업 인 경우 원하는 것이 아닐 수도 있습니다.
이 defined?
방법으로 특정 방법을 처리 하여 방법을 구하십시오. 다음을 사용하십시오.
def method1
return @x if defined? @x
@x = method2
end
악마는 세부 사항에 있지만 defined?
방법으로 숨어있는 상어를 피할 수 있습니다 .
당신은 시도 할 수 있습니다:
unless defined?(var)
#ruby code goes here
end
=> true
부울을 반환하기 때문입니다.
SyntaxError: compile error (irb):2: syntax error, unexpected $end, expecting kEND
unless
진술 을 사용하는 것은 지나치게 복잡해 보인다
다른 많은 예제에서 보듯이 루비에서 논리적으로 선택하기 위해 메소드에서 부울이 실제로 필요하지 않습니다. 실제로 부울이 필요하지 않으면 모든 것을 부울로 강제 변환하는 것은 좋지 않은 형태입니다.
그러나 부울이 절대적으로 필요한 경우. 사용하다 !! (뱅뱅) 또는 "거짓 거짓은 진실을 드러낸다".
› irb
>> a = nil
=> nil
>> defined?(a)
=> "local-variable"
>> defined?(b)
=> nil
>> !!defined?(a)
=> true
>> !!defined?(b)
=> false
강제로 지불하지 않는 이유 :
>> (!!defined?(a) ? "var is defined".colorize(:green) : "var is not defined".colorize(:red)) == (defined?(a) ? "var is defined".colorize(:green) : "var is not defined".colorize(:red))
=> true
다음은 부울 값의 암시 적 강제 변환을 문자열 표현에 의존하기 때문에 중요한 예입니다.
>> puts "var is defined? #{!!defined?(a)} vs #{defined?(a)}"
var is defined? true vs local-variable
=> nil
defined
특정 필드가 해시에 설정되어 있는지 확인 하는 데 사용 하면 예기치 않은 동작이 발생할 수 있습니다.
var = {}
if defined? var['unknown']
puts 'this is unexpected'
end
# will output "this is unexpected"
구문은 여기에서는 정확하지만 defined? var['unknown']
string으로 평가 "method"
되므로 if
블록이 실행됩니다.
편집 : 키가 해시에 있는지 확인하는 올바른 표기법은 다음과 같습니다.
if var.key?('unknown')
"정의 된"과 "할당 된"의 차이점에 유의하십시오.
$ ruby -e 'def f; if 1>2; x=99; end;p x, defined? x; end;f'
nil
"local-variable"
x는 할당되지 않아도 정의됩니다!
NameError Exception: undefined local variable or method
하고 있었고 변수의 유일한 할당 / 멘션이 적중되지 않은 if 블록에있을 때 혼란 스러웠다.
nil
가 초기화 되었음을 주목할 가치 가 있습니다.