변수가 정의되었는지 확인하시겠습니까?
루비에 변수가 정의되어 있는지 확인하려면 어떻게 해야 합니까?가 ?isset
-유형 방법을 사용할 수 있습니까?
을 합니다.defined?
키워드(설명)항목 종류와 함께 String을 반환합니다.nil
만약 존재하지 않는다면 말입니다.
>> a = 1
=> 1
>> defined? a
=> "local-variable"
>> defined? b
=> nil
>> defined? nil
=> "nil"
>> defined? String
=> "constant"
>> defined? 1
=> "expression"
Ascaleee는 "0으로 설정된 변수가 초기화된다는 점에 주목할 필요가 있습니다."라고 논평했습니다.
>> n = nil
>> defined? n
=> "local-variable"
이 기능은 존재하는 경우에는 아무것도 하지 않고 존재하지 않는 경우에는 생성하려는 경우에 유용합니다.
def get_var
@var ||= SomeClass.new()
end
이렇게 하면 새 인스턴스가 한 번만 만들어집니다.그 후에는 계속 var를 반환합니다.
위 문장의 올바른 구문은 다음과 같습니다.
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?(your_var)
효과가 있을 것입니다.당신이 무엇을 하고 있는지에 따라 당신은 또한 다음과 같은 것을 할 수 있습니다.your_var.nil?
"if" 대신 "uncept"를 시도합니다.
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
경고: 일반적인 루비 패턴
그자리의 defined?
방법이 정답입니다.위의 승인된 답변을 참조하십시오.
하지만 조심해요...다음과 같은 일반적인 루비 패턴을 고려합니다.
def method1
@x ||= method2
end
def method2
nil
end
method2
상항되옴아돌을 반환합니다.nil
.- 당신이 처음으로 전화할 때
method1
,@x
되어 있지 . 따라서 변수는 설정되어 있지 않습니다. 따라서method2
될 것입니다. 그리고 니다됩실행▁and됩다니. method2
를 설정합니다.@x
nil
.
하지만 두 번째로 전화를 걸면 무슨 일이 일어날까요?method1
?
@x는 이미 0으로 설정되어 있습니다.그렇지만method2
여전히 다시 실행됩니다!!이 많이 method2는 이 아닐 수도 있습니다.
내버려 둬.defined?
방법은 구조에 옵니다:
def method1
return @x if defined? @x
@x = method2
end
대부분의 경우와 마찬가지로 구현 세부사항에 악마가 있습니다.
사용하다defined? YourVariable
단순하게 유지해 바보야..;)
여기 약간의 코드가 있습니다, 로켓 과학은 아니지만 충분히 잘 작동합니다.
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
분명히, 색칠 코드는 필요하지 않습니다. 단지 이 장난감 예제의 멋진 시각화일 뿐입니다.
시도할 수 있습니다.
unless defined?(var)
#ruby code goes here
end
=> true
부울을 반환하기 때문입니다.
다른 많은 예에서 알 수 있듯이 루비로 논리적 선택을 하기 위해 메서드의 부울이 실제로 필요하지 않습니다.실제로 부울이 필요하지 않는 한 모든 것을 부울로 강제하는 것은 좋지 않은 형태가 될 것입니다.
하지만 부울이 꼭 필요하다면요.사용!! (뱅뱅) 또는 "거짓 허위가 진실을 드러냅니다."
› 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']
문자열로 평가됩니다."method"
그래서if
블록이 실행됩니다.
edit: 해시에 키가 있는지 확인하기 위한 올바른 표기법은 다음과 같습니다.
if var.key?('unknown')
"정의됨"과 "할당됨"의 차이에 유의하십시오.
$ ruby -e 'def f; if 1>2; x=99; end;p x, defined? x; end;f'
nil
"local-variable"
x는 할당되지 않은 경우에도 정의됩니다!
defined?
좋습니다. 하지만 Rails 환경에 있는 경우에도try
특히 동적 변수 이름을 확인하려는 경우:
foo = 1
my_foo = "foo"
my_bar = "bar"
try(:foo) # => 1
try(:bar) # => nil
try(my_foo) # => 1
try(my_bar) # => nil
또한 다음과 같이 코드화하면 보간을 통해 문자열에 정의되어 있는지 여부를 확인할 수 있습니다.
puts "Is array1 defined and what type is it? #{defined?(@array1)}"
유형이 정의된 경우 시스템에서 유형을 알려줍니다.정의되지 않은 경우 변수가 초기화되지 않았다는 경고만 반환됩니다.
이것이 도움이 되길 바랍니다! :)
도움이 될 경우를 대비해 믿을 수 없을 정도로 간단한 예를 남깁니다.
변수가 존재하지 않는 경우:
if defined? a then "hi" end
# => nil
변수가 존재하는 경우:
a = 2
if defined? a then "hi" end
# => "hi"
언급URL : https://stackoverflow.com/questions/288715/checking-if-a-variable-is-defined
'programing' 카테고리의 다른 글
Vue에서 반복 테이블 행의 확인란 값을 배열로 전달하는 방법은 무엇입니까? (0) | 2023.07.19 |
---|---|
16진수를 인쇄할 때 printf가 1바이트만 출력하지 않는 이유는 무엇입니까? (0) | 2023.07.19 |
몽구스에서 랜덤 레코드를 찾는 방법 (0) | 2023.07.14 |
Spring-Boot 다중 모듈 프로젝트 로드 속성 파일 (0) | 2023.07.14 |
예약된 Sql 키워드를 사용하여 명명된 테이블 열을 처리하는 방법 (0) | 2023.07.14 |